2016-10-06 13 views
0

文法を書こうとしていますが、if文に式を書くことができます。antlr4文法非貪欲

私の文は以下のようなものになる場合: [X == 1]の場合、[いくつかのものを行う]

式は任意のPythonの式であると考えられます。

以下のような貪欲でないマッチを使用すると、表現の一部として '['または ']'をどのように指定できますか?リストの理解は私の文法の問題になります。

stmt : ifval 
     | .... 
     ; 

ifval : IF expr body ; 

expr : LBRACK expr? RBRACK 
     | NOT expr 
     | WORD (LBRACK WORD? RBRACK)? // value or array[idx] 
     | .... 
     ; 

body : WORD 
     | LBRACE stmt* RBRACE 
     | .... 
     ; 

exprルールは再帰を通して任意およびネストされたブラケットの発生を処理する:

ifval 
    : (SPACE)* IF (SPACE|WORD)* SQRLBRACE .*? SQRRBRACE (WORD|SPACE)* <blah> <blah>; 

WORD  : ('a'..'z' | 'A'..'Z'| '_' | '-')+; 
NUM  : [0-9]; 
NEWLINE : '\r'? '\n' | '\r'; 
SPACE : (' ' | '\t') ; 
SQRRBRACE: ']'; 
SQRLBRACE: '['; 
+0

わかりません。あなたは、Pythonをターゲットにしているようですが、その言語の文がそのように角括弧を使用しない場合です。 –

+0

私は英語のような文を書くことができる小さな言語を書いていて、 '英語のような'文をPythonに変換します。式を評価するために、ifステートメントを言語に追加する必要がありました。 ifステートメントでは、私はいかなるpythonの表現もサポートしたいと考えていました。私は理にかなってほしい – kgunjikar

答えて

1

一般に、典型的なステートメント製剤を使用します。

ところで、ほとんどの場合、文法中の空白を非表示にする方が良いでしょう。たとえPython /空白に敏感な言語であってもそうです。隠すことで、WSはインデントレベルを計算するために簡単にアクセス可能なままです。そして、文法は、SPACE *のすべての考えられる場所を指定することによって汚染されません。