4

私はBNFコンバーターで少し遊んで、 Mathematica言語の一部を再設計しようとしました。私のBNFにはすでに約150行あり、非常に基本的なバグに気付くまでは問題なく動作していました。Mathematicaの括弧[]は2つの異なる目的で使用されます

  1. expr[arg]関数を呼び出す
  2. 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でこれを実現できるかどうか誰かに教えてもらえますか?

(ところで、他のヒントもありがたいことに取られるでしょう)

4

1 に答える 1

3

あなたの問題はトークン"]]"です。レクサーが過去の記憶を持たずにこれを収集すると、誤っている可能性があります。だから、それをしないでください!

パーサーは、定義上、左側のコンテキストを記憶しているため、ブラケットのマッチングを正しく行うことができます。

私はあなたの文法をこのように定義します:

FunctionCall.   Expr ::= Expr "[" [Sequence] "]" ;
Part.           Expr ::= Expr "[" "[" [Sequence] "]" "]" ;   

レクサーは単一の"[""]"のみをトークンとして検出します。

奇妙な変種:

FunctionCall.   Expr ::= Expr "[" [Sequence] "]" ;
Part.           Expr ::= Expr "[[" [Sequence] "]" "]" ; 

字句解析プログラムは、「[[」をトークンとして検出します。これは、誤解されないためです。

于 2013-01-11T05:58:46.777 に答える