2016-08-08 7 views
0

私は私が作成していますミニ言語のための文法を用意し、私は特にvar : functioncall '.' functioncallと基本的にsomefunction().varに対応functioncall : var '.' functioncallvarfunctioncallAntlr4相互左再帰エラー

var 
: NAME 
| var '[' exp ']' 
| var '.' var 
| functioncall '.' var 
; 
functioncall 
: NAME '(' (exp)? (',' exp)* ')' 
| var '.' functioncall 
| functioncall '.' functioncall 
; 

間の相互左再帰エラーを取得していますおよびinstanceofClass.function()

私はこれを達成する方法はありますか?

編集:文法もvarが(その前ではなく)instance.varまたはfunction().var

答えて

2

ANTLR 4は、同じルールで両面再帰を扱うことができますすることができvar '=' expのようなものを許可する必要があります。だから何か

expr: expr '+' expr | NUMBER 

有効です。

したがって、varまたは関数呼び出しのいずれかを抽象化する別の新しい規則を追加できます。

value 
: var 
| functioncall 
| value '.' value 
; 

var 
: NAME 
| var '[' exp ']' 
; 

functioncall 
: NAME '(' exp? (',' exp)* ')' 
; 

文法は(人間の読者にとって)解析するのが簡単であるだけでなく、相互再帰もありません。

注:テストされていません。

+0

この文法は、1つを除いてほとんどの場合有効です。言語はまた、単純なfunctioncall、すなわち単純にfunctioncallを含む行を可能にすると考えられている。しかし、単一行の変数、すなわち単に 'instance.function()'だけを含む行は許可されていないと考えられますが、 'variable'は無効です。以前私は、行内に単一変数を許可しないことでこれを許可しました。これを達成する方法は? – Crimson7

+0

@Nick_McCoyは 'value:var 'のような必要な構文を追加する' value:var'ルールを改善するだけです。値 '。 – Mephy

+0

これはvar '=' expのようなものを許可しません。また、私の編集したコメント – Crimson7