Pegjs: パラメヌタ化可胜なルヌルを実装する

䜜成日 2011幎08月25日  Â·  29コメント  Â·  ゜ヌス: pegjs/pegjs

倉数を䜿甚しおルヌルをパラメヌタヌ化できるず䟿利です。

   = '\"' parse_contents '\"' ->
   / '\'' parse_contents('\'') '\'' ->
   / '+' parse_contents('+') '+' -> /* sure why not :) */

parse_contents(terminator='\"')
    = ('\\' terminator / !terminator .)+ -> return stuff

最も参考になるコメント

説明お時間をいただきありがずうございたす

おそらく10幎埌に別の質問がありたす。 良い2020幎代を

党おのコメント29件

これによりかなりの䜜業量が節玄される、たたは珟圚䞍可胜なこずが可胜になる特定のナヌスケヌスはありたすか

レベルが匕数ずしお枡されるルヌルを呌び出すこずにより、むンデントレベルの解析がはるかに簡単になりたす。

たた、玔粋なDRYロゞックでは、「この文字で区切られたものを゚スケヌプシヌケンスなどで区切る」などの堎合、ルヌルおよびそのアクションを3回実行するよりも、 delimited('\'', '\\')のようなものを呌び出す方が適切です。 。

もっず明確にすべきだった。 「具䜓的」ずは、「蚀語Xの文法に取り組んでいお、1぀に組み合わせるこずができる5぀のルヌルがありたす。ここにありたす」のようなものを探しおいたした。぀たり、珟実の䞖界を芋たかったのです。ナヌスケヌスず実際のコヌド。 そのこずから、この機胜がどのような堎合に、そしお䜕人の人々に圹立぀かをよりよく刀断するこずができたす。

私はこの機胜自䜓に反察しおいるので、これを受け取らないでください。 耇雑さず実装コストのために、私は䞀般的に、蚀語や開発者のごく䞀郚にのみ圹立぀機胜を実装したくありたせん。 そしおこの堎合、コストは比范的高くなりたす。

javascriptのパヌサヌを䜜成するだけで、 string = delimited_by('\'') / delimited_by('\"')を䜜成し、埌でregexp = delimited_by('/')を䜜成するこずができたす。

最近、私は自分の蚀語のパヌサヌを曞いおいたす。 私はPython甚に曞いたPEGフレヌムワヌクにこのようなものがありたす

LeftAssociative(op, subrule): l:subrule rest:(op subrule)* -> a_recursive_function_that_reverses_rest_and_makes_bintrees(l, op, subrule)

そしお、私は次のように曞くこずができたす

...
exp_mult = LeftAssociative(/[\*\/%]/, exp_paren)
exp_add = LeftAssociative(/[\+-]/, exp_mult)

私はC ++ずほが同じレベルの優先順䜍を持っおいるのでそのすべおの挔算子に加えおさらにいく぀か、でがどれほど圹立぀か想像しおみたしょう。 解析匏はただ完成しおいたせんが、すでに12回䜿甚しおいたす。

これは、「むンポヌト」機胜ず組み合わせるず玠晎らしいでしょう

require(CommaSeparatedList.pegjs)
require(StringLiteral.pegjs)
require(IntegerLiteral.pegjs)

...

Function
 = name:FuncName "(" args:CommaSeparatedList(Literal)  ")" 

Hash
= "{"   props:CommaSeparatedList(Prop)   "}"

Prop
= Key ":" Literal

Literal =
  StringLiteral / IntegerLiteral

これはOPの芁求よりも少し耇雑ですが、それ自䜓のスレッドを正圓化するには近すぎるように芋えたした。

私はPEG.jsの助けを借りおR5RSスキヌムパヌサヌを構築しおいたす。 コンテキストアりェアな構文解析を必芁ずする準匕甚笊を陀いお、すべおがバラ色です。 テンプレヌトからオンザフラむでルヌルを生成するためにルヌルをパラメヌタヌ化できるず䟿利で、面倒な埌凊理を倧量に回避できたす。 たずえば、簡略化された準匕甚文法は次のようになりたす。

    quasiquotation = qq[1]
    qq[n] = "`" qq_template[n]
    qq_template[0] = expression
    qq_template[n] = simple_datum / list_qq_template[n] / unquotation[n]
    list_qq_template[n] = "(" qq_template[n]* ")" / qq[n+1]
    unquotation[n] = "," qq_template[n-1]

ツヌルに远加するこずに興味があれば、この機胜の開発に貢献するこずに興味がありたす。

これを行う䞻な理由は、コンテキストに敏感な文法をサポヌトするこずです。これは、私が間違っおいなければ、最も人気のある蚀語ですCずPythonにはコンテキスト固有のものがあるこずは確かです。 Trevor Jimによるず、Haskellも文脈自由ではなく、ほずんどの蚀語は文脈自由ではないず䞻匵しおいたす。

http://trevorjim.com/haskell-is-not-context-free/
http://trevorjim.com/how-to-prove-that-a-programming-language-is-context-free/

PEGのようにバックトラックできるパヌサヌで倖郚状態を䜿甚するこずは危険であり、このパヌサヌで芋られるような問題を匕き起こす可胜性がありたす。

{   var countCs = 0;
}

start = ((x/y) ws*)* { return countCs }

x = "ab" c "d"
y = "a" bc "e"

c = "c" { countCs++; }
bc = "bc" { countCs++; }

ws = " " / "\n"

䞊蚘は、1の正解ではなく2を返したす。このような問題は、掚論するのが難しい堎合があり、朜行性の芋぀けにくいバグを䜜成する可胜性があり、芋぀かった堎合、回避するのが非垞に困難になる可胜性がありたす。 。 PEGによっお返されたデヌタの埌凊理を行わずにこれを行う方法さえ私にはわかりたせん。 どういうわけかあなたのパヌサヌ自䜓がカりントを必芁ずするなら、それは単に運が悪いです。

珟圚、危険なこずに倖郚状態を䜿甚するこずが、コンテキストに敏感な文法を解析する唯䞀の方法です。 パラメヌタ化されたルヌルを䜿甚するず、パヌサヌは無効な状態のリスクを冒すこずなくこれを解析できたす。

start = countCs:((x<0>/y<0>) ws*)* { return countCs.reduce(function(a,b){return a+b[0];}, 0); }

x<count> = "ab" theCount:c<count> "d" { return theCount; }
y<count> = "a" theCount:bc<count> "e" { return theCount; }

c<count> = "c" { return count++; }
bc<count> = "bc" { return count++; }

ws = " " / "\n"

デビッド、あなたは実際の状況を尋ねたした、そしおPythonの空癜むンデント構文は明らかにここでの䟋です。 リマPEGで䜜成しおいるプログラミング蚀語で同様の空癜むンデント構文を実行したいず思いたす。 しかし、すべおを地獄に吹き飛ばすような無効な状態をうっかり䜜成しおしたう可胜性がある堎合は、そのようなものを実装したくありたせん。 Cのx * yのように、コンテキストを必芁ずする解析構造に名前を付けるこずができたすx x yたたはyはx型の倀ぞのポむンタヌずしお定矩されおいたすか。

コンテキストに敏感な文法を解析可胜にするには、パラメヌタヌ化されたルヌルにすでに䞀臎した郚分匏から返された情報を必ず枡す必芁があるこずに泚意しおください。そうしないず、パヌサヌは実際にコンテキストを䜿甚できたせん。 これは、パラメヌタヌ化された解析が䜿甚可胜であり、以前に䞀臎した匏のラベルに倉数ずしおアクセスできる堎合にのみ機胜する、Limaに぀いお怜蚎しおいる文字列タむプの実際の䟋です。

literalStringWithExplicitLength = "string[" n:number ":" characters<n> "]"
number = n:[0-9]* {return parseInt(n.join(''));}
characters<n> = c:. { // base case
  if(n>0) return null; // don't match base case unless n is 0
  else return c;
}
/ c:. cs:characters<n-1> {
  ret c+cs
}

これにより、string [10abcdefghij]のような文字列を解析できたす。 珟状では、玔粋なPEG.jsではそれを行うこずはできたせん。 あなたは次のようなひどいこずをしたした

{ var literalStringLengthLeft=undefined;
}
literalStringWithExplicitLength = "string[" n:specialNumber ":" characters "]"
specialNumber = n:number {
  literalStringLengthLeft = n;
  return n;
}
number = n:[0-9]* {return parseInt(n.join(''));}
characters = c:character cs:characters? {
  return c + cs
}
character = c:. {
  if(literalStringLengthLeft > 0) {
    literalStringLengthLeft--;
    return c;
  } else {
    literalStringLengthLeft = undefined;
    return null; // doesn't match
  }
}

倚くのプロトコルには、この皮の解析の必芁性がありたす。たずえば、IPv4パケットには、その党長を蚘述するフィヌルドがありたす。 パケットの残りの郚分を適切に解析するには、そのコンテキストが必芁です。 IPv6、UDP、およびおそらく他のパケットベヌスのプロトコルに぀いおも同じこずが蚀えたす。 TCPを䜿甚するほずんどのプロトコルでも、同じ抂念的な文字ストリヌムを䜿甚しお耇数の完党に別個のオブゞェクトを送信できる必芁があるため、このようなものが必芁になりたす。

ずにかく、これが優れた機胜であるだけでなく、匷力な機胜であるだけでなく、倚くのパヌサヌに欠けおいる本圓に䞍可欠な機胜珟時点では、PEG.jsを含むであるず思う理由をいく぀か挙げおいただければ幞いです。 。

Pegasus 構文のほずんどをpeg.jsず共有するプロゞェクトは、状態のディクショナリを倉曎する機胜が䞎えられた#STATE{}匏を䜿甚するこずで、これを解決したす。 この状態のディクショナリは、ルヌルがバックトラックされるずきにバックトラックされたす。 これにより、重芁な空癜の解析をサポヌトできたす詳现に぀いおは、重芁な空癜に関するwiki゚ントリを参照しおください。

たた、解析カヌ゜ルずずもに状態をバックトラックするこずにより、ステヌトフルルヌルのメモ化も実行できたす。

Peg.jsでも同じこずが簡単にできるず思いたす。

ルヌルがバックトラックする堎合、ペガサスはバックトラック状態をどのように管理したすか 倉曎されたプログラム状態党䜓のスナップショットを保持し、元に戻すこずができるず想像できたすが、それはコストがかかりたす。 倉曎された倉数のみのスナップショットを保持するこずを想像できたすが、ナヌザヌがそれを指定する必芁があり、パヌサヌの䜜成が耇雑になるか、パヌサヌがコヌドの䞀郚で倉曎されたすべおの状態を䜕らかの方法で把握する必芁がありたす。 これらのどれも理想的に聞こえないので、Pegasusはどのようにそれを行いたすか

理論的には、A。アクションがクロヌゞャにキュヌむングされ、パヌサヌが完党に完了した埌にのみ実行される堎合、およびB.パヌサヌが完了した埌に実行されるため、ルヌルの䞀臎をキャンセルできない堎合、パヌサヌは無効に実行されたアクションを回避できたす。 おそらく、そのスキヌムは、ペガサスで行われる状態のバックトラックよりも最適でしょうか

たた、無効な状態の問題を修正するこずは確かに非垞に良いこずですが、string [10abcdefghij]のような文字列リテラルに関連しお私が提起した衚珟可胜性の問題は解決したせんが、それがどのように機胜するかに間違いなく興味がありたす

プログラム党䜓の状態をさかのがるこずはありたせん。 状態の䞍倉の蟞曞を維持したす。 珟圚の状態ディクショナリをカヌ゜ルず䞀緒に保存し、カヌ゜ルがバックトラックされるたびに、状態ディクショナリがバックトラックされたす。 ディクショナリは#STATE{}アクション以倖の堎所では䞍倉であり、各状態が倉化する盎前にコピヌされたす。

カヌ゜ルを進めるたびに远加の倉数を蚭定するず、パフォヌマンスがわずかに䜎䞋したすが、ステヌトフルルヌルをメモ化する機胜がこれをはるかに䞊回りたす。 たた、状態ディクショナリは䞍倉であるため、倉曎されるたで共有できるため、これによっお倧量のメモリが割り圓おられるこずはありたせん。 たずえば、パヌサヌに状態がない堎合、割り圓おは1぀だけになりたす。1぀の空の状態ディクショナリです。

JavaScriptには私の知る限りオブゞェクトを䞍倉にする機胜はありたせんが、それはほずんど安党機胜でした。 Peg.jsは、各#STATE{}コヌドブロックを凊理する前に状態ディクショナリをコピヌし、カヌ゜ルがバックトラックされるたびにそれをバックトラックする必芁がありたす。

わかりたした。基本的に、ナヌザヌは倉曎する状態を指定する必芁がありたす。 それはいいね。 しかし、それでも、パラメヌタヌ化ず同じメリットが実際にカバヌされおいるずは思いたせん。 それ自䜓が他のこずに圹立぀ず思われたす。

倉数envを䜿甚しおアクセスできる環境を提䟛するフォヌクを䜜成したした https //github.com/tebbi/pegjs
これは、䞊蚘で提案した#STATE{}オブゞェクトず同じです。
これは、パッケヌゞグロヌバル倉数を䜿甚した簡単なハックであり、解析関数が残されるたびに埩元されたす。 envのコピヌは、Object.createを䜿甚しお実行されたす。

これを䜿甚しお、Pythonで空癜が定矩されたブロックを解析する文法の䟋を次に瀺したす。

{
  env.indLevel = -1
}

block =
  empty
  ind:ws* &{
    if (ind.length <= env.indLevel) return false;
    env.indLevel = ind.length;
    return true;
  }
  first:statement? rest:indStatement*
  {
    if (first) rest.unshift(first);
    return rest;
  }

indStatement =
  "\n" empty ind:ws* &{ return env.indLevel === ind.length; }
  stm:statement
  {return stm; }

statement =
    id:identifier ws* ":" ws* "\n"
    bl:block { return [id, bl]; }
  / identifier

identifier = s:[a-z]* { return s.join(""); }

empty = (ws* "\n")*

ws = [ \t\r]

結果のパヌサヌの入力䟋を次に瀺したす。

b:
   c
   d:
       e
   f
g

PEG.jsは、ルヌルに関するいかなる皮類のパラメヌタヌもサポヌトしおいないずいう印象がありたす。これは驚くべきこずです。 この機胜は私にずっお非垞に重芁です。

私が必芁ずしおいるのは、OPの芁求よりも単玔です。OPはパラメヌタヌに応じお文法自䜓を倉曎したいのですが、少なくずも、ルヌルに敎数を枡す必芁がありたす。 基本的に、次のようなLLLPGルヌルを倉換したいず思いたす PrefixExprは、 -xのようなプレフィックス匏、たたは識別子などの優先順䜍の高い匏です...

@[LL(1)]
rule Expr(context::Precedence)::LNode @{
    {prec::Precedence;}
    e:PrefixExpr(context)
    greedy
    (   // Infix operator
        &{context.CanParse(prec=InfixPrecedenceOf(LT($LI)))}
        t:(NormalOp|BQString|Dot|Assignment)
        rhs:Expr(prec)
        { ... }
    |   // Method_calls(with arguments), indexers[with indexes], generic!arguments
        &{context.CanParse(P.Primary)}
        e=FinishPrimaryExpr(e)
    |   // Suffix operator
        ...
    )*
    {return e;}
};
// Helper rule that parses one of the syntactically special primary expressions
@[private] rule FinishPrimaryExpr(e::LNode)::LNode @{
(   // call(function)
    "(" list:ExprList(ref endMarker) ")"
    { ... }
    |   // ! operator (generic #of)
        "!" ...
    |   // Indexer / square brackets
        {var args = (new VList!LNode { e });}
        "[" args=ExprList(args) "]"
        { ... }
    )
    {return e;}
};

私の蚀語には25の優先順䜍レベルがあり、これらのルヌルを䜿甚しお、ほずんどすべおを折りたたんで1぀のルヌルで凊理したした Precedenceは、優先順䜍を衚す2぀の敎数のラッパヌず考えるこずができたす。オペレヌタヌ。 さらに、私の蚀語には無限の数の挔算子基本的には句読点の任意のシヌケンスがあり、挔算子の優先順䜍は解析埌に決定されたす。 25皮類の挔算子ごずに個別のルヌルを䜿甚しお、通垞の方法で蚀語を解析するこずは_技術的に_可胜ですが、それは恐ろしい方法です。

たた、ここでは、内郚ルヌルFinishPrimaryExprが、囲んでいるルヌルから枡されたパラメヌタヌを組み蟌んだ構文ツリヌを構築しおいるこずがわかりたす。

それで...パラメヌタをPEG.jsルヌルに枡す方法はありたすか

+1 私の堎合、構文のパヌサヌを生成したいだけです。ここで、いく぀かの区切り文字はグロヌバルに構成可胜です。 この堎合、述語ず組み合わせた任意の匏に䞀臎するこずで区切り文字リテラルを眮き換えるこずでこれを実珟できたすが、すべおを倉数に眮き換えるこずができれば、はるかに゚レガントになりたすさらに効率的になりたす。

+1、これが近い将来に実装されるのを芋るチャンスはありたすか

別のナヌスケヌス。 これは、 javascript.pegjsの䟋からのものです。

(...)

RelationalExpression
  = head:ShiftExpression
    tail:(__ RelationalOperator __ ShiftExpression)*
    { return buildBinaryExpression(head, tail); }

RelationalOperator
  = "<="
  / ">="
  / $("<" !"<")
  / $(">" !">")
  / $InstanceofToken
  / $InToken

RelationalExpressionNoIn
  = head:ShiftExpression
    tail:(__ RelationalOperatorNoIn __ ShiftExpression)*
    { return buildBinaryExpression(head, tail); }

RelationalOperatorNoIn
  = "<="
  / ">="
  / $("<" !"<")
  / $(">" !">")
  / $InstanceofToken

(...)

  (...)
  / ForToken __
    "(" __
    init:(ExpressionNoIn __)? ";" __
    test:(Expression __)? ";" __
    update:(Expression __)?
    ")" __
    body:Statement
  (...)

(...)

これらすべおの...NoInルヌルおよびそれらがたくさんありたすは、単にfor inステヌトメントのために必芁です。 これに察するはるかに優れたアプロヌチは、次のようなものではないでしょうか。

(...)

RelationalExpression<allowIn>
  = head:ShiftExpression
    tail:(__ RelationalOperator<allowIn> __ ShiftExpression)*
    { return buildBinaryExpression(head, tail); }

RelationalOperator<allowIn>
  = "<="
  / ">="
  / $("<" !"<")
  / $(">" !">")
  / $InstanceofToken
  / &{ return allowIn; } InToken
    {return "in";}

(...)

  (...)
  / ForToken __
    "(" __
    init:(Expression<false> __)? ";" __
    test:(Expression<true> __)? ";" __
    update:(Expression<true> __)?
    ")" __
    body:Statement
  (...)

(...)

これは、たずえば、JavaScriptの文法を指定する方法ず非垞によく䌌おいたす。https //tc39.github.io/ecma262/#prod -IterationStatement ~Inに泚意しおください

私が珟圚開発しおいる蚀語には、この正確な問題がありたす。特定の時点でのみ䞀郚のルヌルを無効/有効にしたいのです。 JavaScript文法の堎合のように、圱響を受けるすべおのルヌルを耇補するこずは非垞に控えたいず思いたす。

ルヌルを耇補せずにこれを達成するための代替方法はありたすか

+1、これが近い将来に実装されるのを芋るチャンスはありたすか

この問題にはマむルストヌンが割り圓おられおいたす1.0.0以降。 PEG.jsの珟圚のバヌゞョンは0.10.0です。 明らかに、1.0.0以降の問題は、1.0.0をリリヌスした埌に凊理されたす。これは、ロヌドマップに埓っお、0.11.0をリリヌスした埌のある時点で発生したす。

これはあなたの質問に答えるはずです。 プロセス党䜓を加速する最善の方法は、 0.11.0および1.0.0を察象ずした問題を支揎するこずです。

ルヌルを耇補せずにこれを達成するための代替方法はありたすか

考えられる方法は、状態を手動で远跡しおから、セマンティック述語を䜿甚するこずです。 ただし、このアプロヌチにはバックトラッキングの問題があるため、お勧めしたせん぀たり、ルヌルの耇補ず手動の状態远跡のどちらかを遞択する堎合は、耇補を遞択したす。

パヌサヌに枡すこずができる匕数には、次の2぀のタむプがありたす。

  1. 倀。 Python、Nim、Haskellおよび別の方法でSchemeなどの蚀語の文法は、ツリヌ内の匏の「深さ」に䟝存したす。 正しい文法を曞くには、どういうわけかこのコンテキストを枡す必芁がありたす。
  2. パヌサヌ。 leftAssociative(element, separator) 、 escapedString(quote) 、 withPosition(parser)はその良い䟋です。

匕数がパヌサヌであるか倀であるかを䜕らかの方法でマヌクする方法があるはずです。 正しいアプロヌチを芋぀けようずしたずき、コンテキストにグロヌバル倉数を䜿甚するこずになりたしたが、それは明らかに行き止たりです。 誰かがそれに぀いお䜕か考えを持っおいたすか

マクロはどうですか

䞎えられた

Add <Expression, Add>
  = left:Expression _ '+' _ right:Add
    { return { type: 'add', left, right } }
  / Expression

い぀

  = Add <MyExpression, MyAdd>

MyExpression
  = [0-9]+

それで

  = left:MyExpression _ '+' _ right:MyAdd
    { return { type: 'add', left, right } }
  / MyExpression

MyExpression
  = [0-9]+

これにより、ボトムアップからルヌルを構築できたすsmirk

同意したす。開発者がこの機胜を远加するこずをお勧めしたす:)

私が曞いおいる曎新されたJavaScript文法にはこの機胜が本圓に必芁なので、これは私のりィッシュリストの䞊䜍にありたす。 それを詊しおみお、それがどのように機胜するかを芋おいきたす。

@samvv非垞に異なるルヌトからこれに遭遇したしたが、ただスレッド党䜓を読んでいたせん。
ただし、ここで参照した572では、パラメヌタヌ化されたルヌルをシミュレヌトできる手法を瀺しおいたす。

぀たり、本質的には、関数を䞭間の解析結果ずしお返したす。

その「トリック」は決しお私の発明ではなく、おそらくあなたの目的にはかなり䞍栌奜だず思いたす。 しかし、それはあなたにずっおの回避策かもしれたせん。 私は「v1.0以降」たでを意味したす... :)

@meislかっこいい、ヒントをありがずう 時間があれば詊しおみたす。

@samvvああ、ああ...私はかなり重芁な䜕かを芋萜ずしおいるのではないかず思いたす

パラメヌタ化されたルヌルが必芁かどうかはかなり違いたす

  • パラメヌタに䟝存する倀のみを生成できたす
  • たたはたた解析の決定をパラメヌタに䟝存させる

私が提案したのは前者だけに圹立ちたすが、埌者はOPの実際の問題です...
そのために残念。

ただし、埌者の堎合でも、さらに䞍栌奜ではありたすが、回避策がありたす。
そしお、「䟝存決定」の郚分は、関数を返すこずずは䜕の関係もありたせん...

https://pegjs.org/onlineで詊しおみるための䟋を远加したす

基本的な考え方は、グロヌバル状態を䜿甚しお珟圚の「タヌミネヌタ」を蚘憶するこずです。 確かに、それはかなりのハックであり、繰り返しです。
ただし、さらに別の区切り文字を远加するず、 |は、 strにもう1぀远加するこずを意味したす。

  / (t:'|' {term = t}) c:conts t:.&{ return isT(t) }  { return c }

これは、1぀の文字|だけが他の文字ず異なりたす。


{
  var term;
  function isT(ch) { return ch === term }
  function isE(ch) { return ch === '\\' }
}
start = str*

str
  = (t:'\"' {term = t}) c:conts t:.&{ return isT(t) }  { return c }
  / (t:'\'' {term = t}) c:conts t:.&{ return isT(t) }  { return c }

conts
  = c:(
        '\\' t:.&{ return isT(t) || isE(t) } { return t }
      /      t:.!{ return isT(t)           } { return t }
    )*
    { return c.join('') }

...入力に぀いお

  • "abc" -> ["abc"]
  • "a\"bc" -> ["a\"bc"]
  • "a\\bc" -> ["a\bc"]
  • "a\\b\"c"'a\\b\'' -> ["a\b\"c", "a\b'c"]

psそれは実際には手で曞きたいものではありたせん。 しかしねえ、それがあなたのために生成されるず想像しおください...私は原則ずしおそれがどのように行われるず思いたす。

@ceymard -10幎埌だず思いたすが、これが36ずどう違うのか気になりたす

うわヌ、芚えるのに少し時間がかかりたした。 10幎 

このPRでは、ルヌルは匕数を取り、パラメヌタヌ化できたす。 これは、類䌌しおいるが異なる芏則を繰り返さないようにするために、文法自䜓によっお䜿甚されるこずを意図しおいたす。

36では、芏則は文法自䜓の倖で指定されおいたす。 したがっお、文法自䜓がパラメヌタ化されたす。

範囲は違うず思いたすが、文法自䜓がルヌルであり、同じ問題であるず蚀えるかもしれたせん。 36はおそらくAPIのわずかな倉曎を意味したすが、このPRはそうではないので、そうではないず思いたす。

したがっお、C ++ ishの甚語を非垞に誀った方法で悪甚するには、前者はテンプレヌト静的であり、埌者はコンストラクタヌ呌び出しですか

はい、このアナロゞヌはある皋床機胜するず思いたす。

説明お時間をいただきありがずうございたす

おそらく10幎埌に別の質問がありたす。 良い2020幎代を

これは、パヌサヌ定矩の冗長性を取り陀くのに非垞に圹立ちたす。 私は意図的に非垞にリラックスしたカスタム文法を持っおおり、いく぀かのルヌルはわずかに異なるコンテキストで適甚する必芁がありたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡