私はBNFコンバーターで少し遊んで、 Mathematica言語の一部を再設計しようとしました。私のBNFにはすでに約150行あり、非常に基本的なバグに気付くまでは問題なく動作していました。Mathematicaの括弧[]
は2つの異なる目的で使用されます
expr[arg]
関数を呼び出すlist[[spec]]
式の要素にアクセスするには、たとえばList
識別子、関数呼び出し、要素アクセス、および引数としての式のシーケンスのみで構成される言語のパーサーを作成するとします。これらのフォームは有効です
f[]
f[a]
f[a,b,c]
f[[a]]
f[[a,b]]
f[a,f[b]]
f[[a,f[x]]]
BNFCの直接の、しかし明らかに間違った入力ファイルは、次のようになります。
entrypoints Expr ;
TSymbol. Expr1 ::= Ident ;
FunctionCall. Expr ::= Expr "[" [Sequence] "]" ;
Part. Expr ::= Expr "[[" [Sequence] "]]" ;
coercions Expr 1 ;
separator Sequence "," ;
SequenceExpr. Sequence ::= Expr ;
このBNFは、最初のコードブロックの最後の2つの例では機能しません。
問題は、作成されたYylex
レクサーファイルにあるようです。このファイルは、個別に一致]
し]]
ます。これは間違っています。最後の例でわかるように、それが終了であるかどうか、または]
コンテキスト]]
に依存するかどうかです。したがって、正しい一致を保証するために中括弧のスタックを作成するか、それをパーサーに任せる必要があります。
BNFCでこれを実現できるかどうか誰かに教えてもらえますか?
(ところで、他のヒントもありがたいことに取られるでしょう)