1

URL を読んでいて (そしてコピーしようとして)、失敗しました... (antlr の素晴らしい記事も)。

https://supportweb.cs.bham.ac.uk/docs/tutorials/docsystem/build/tutorials/antlr/antlr.html

括弧を追加する前の私の解決策:

whereClause: WHERE expression -> ^(WHERE_CLAUSE expression);
expression: orExpr;
orExpr: andExpr (OR^ andExpr)*;
andExpr: primaryExpr (AND^ primaryExpr)*;
primaryExpr: parameterExpr | inExpr | compExpr;

無限再帰のために失敗した私のソリューション (しかし、LPAREN^ と RPAREN! がそれを解決するはずだと思いましたか???)....

whereClause: WHERE^ (expression | orExpr);
expression: LPAREN^ orExpr RPAREN!;
orExpr: andExpr (OR^ andExpr)*;
andExpr: primaryExpr (AND^ primaryExpr)*;
primaryExpr: parameterExpr | inExpr | compExpr | expression;

一番下の primaryExpr には、LPAREN と RPAREN を持つ式が追加されていますが、WHERE は orExpr または式にすることができます (つまり、最初の式は括弧を使用することも使用しないこともできます)。

これはおそらく、タイプミスのような単純な問題であり、何時間も見つめ続けていると確信しています。

4

1 に答える 1

1

URLを読んで(コピーしようとして)失敗しました...(antlrの素晴らしい記事も)...

この記事では、v3 とは大幅に異なる構文を持つ ANTLR v2 について説明していることに注意してください。ここでまともなANTLR v3チュートリアルを探してください: https://stackoverflow.com/questions/278480/antlr-tutorials

無限再帰のために失敗した私のソリューション (しかし、LPAREN^ と RPAREN! がそれを解決するはずだと思いました???)....

それがWHILE.の後の唯一の式だったら ただし、orExprあなたのケースでは問題が発生しています (それを削除すると、その再帰エラーはなくなります)。

通常、括弧で囲まれた式は優先順位が最も高いためprimaryExpr、次のようにルールに配置する必要があります。

grammar T;

options {
  output=AST;
}

parse       : whereClause EOF!;
whereClause : WHERE^ expression;
expression  : orExpr;
orExpr      : andExpr (OR^ andExpr)*;
andExpr     : primaryExpr (AND^ primaryExpr)*;
primaryExpr : bool | NUMBER | '('! expression ')'!;
bool        : TRUE | FALSE;

TRUE        : 'true';
FALSE       : 'false';
WHERE       : 'where';
LPAREN      : '(';
RPAREN      : ')';
OR          : '||';
AND         : '&&';
NUMBER      : '0'..'9'+ ('.' '0'..'9'*)?;
SPACE       : (' ' | '\t' | '\r' | '\n')+ {skip();};

入力"where true || false"と両方"where (true || false)"が次の AST で解析されます。

ここに画像の説明を入力

于 2012-07-07T05:50:55.540 に答える