まだAntlrに取り組んでいますが、ドキュメントで見つけられないものを検索しています。
文字列の「not」パターンを検出できるパーサーは次のとおりです。
factor : 'not'^ primary| primary;
(and some other lines).
しかし、プライマリの後に式を検出したい場合はどうなりますか?例えば
B exists
式の残りの部分を検索するパーサールールを定義するにはどうすればよいですか?類推してみましたが、今までうまくいきませんでした。
exists : primary 'exists'^ | primary;
私の表現のどこに配置するかによって、私は
line 1:44 extraneous input 'exists' expecting ')'
また
line 1:3 mismatched input 'exists' expecting ')'
line 1:22 missing EOF at ')'
エラー
ありがとうございました !
編集:
私はあなたとまったく同じ文法を持っていますが、一つだけです。これが私のコードです:
// Aiming at parsing a complete BQS formed Query
grammar Logic;
options {
backtrack=true;
output=AST;
}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
parse
: expression EOF -> expression
; // ommit the EOF token
expression
: query
;
query
: term (OR^ term)* // make `or` the root
;
term
: factor (AND^ factor)*
;
factor
: NOT^ primary
| primary
;
primary // this one has to be completed (a lot)
: atom (LIKE^ atom)* // right expressions have to be indicated
| atom (EXISTS^)?
;
atom
: ID
| '('! expression ')'! // omit both ( and )
;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
// GENERAL OPERATORS:
NOTLIKE : 'notlike'; // whitespaces have been removed
LIKE : 'like';
EXISTS : 'exists';
OR : 'or';
AND : 'and';
NOT : 'not';
//ELEMENTS
ID : (CHARACTER)+;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;
したがって、問題は明らかにここから発生します。
私はここで深刻な問題を抱えています。すべてのorを削除した後、またはではなく、プライマリが次の形式のいずれかになることを期待します。
A like B
また
A exists
私のコードの何がそんなに悪いのですか?これはまさに私の主なルールが言っていることだと思いますか?
私は本当に自分自身をデバッグする方法を見つけたいと思っています、なぜならこれは:
line 1:3 mismatched input 'like' expecting ')'
本当に自明ではありません
助けてくれてありがとう、私は本当にantlrドキュメントのウェブサイトを理解するのに苦労しています:s。