仍在研究 Antlr,我搜索了一些我在文档中找不到的东西。
这是一个可以检测字符串中的“非”模式的解析器:
factor : 'not'^ primary| primary;
(and some other lines).
但是如果我想在我的 primary 之后检测一个表达式怎么办?例如
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 和 not 之后,我希望我的主要形式是:
A like B
或者
A exists
我的代码有什么问题?我认为这正是我的主要规则所说的?
我真的很想找到一种方法来调试自己,因为:
line 1:3 mismatched input 'like' expecting ')'
真的不言自明
非常感谢您的帮助,我真的很难理解 antlr 文档网站:s。