“令牌冲突”在布尔查询解析器中
我正在创建一个简单的布尔查询解析器。我想做下面这样的事情。
grammar BooleanQuery; options { language = Java; output = AST; } LPAREN : ( '(' ) ; RPAREN : ( ')' ); QUOTE : ( '"' ); AND : ( 'AND' | '&' | 'EN' | '+' ) ; OR : ( 'OR' | '|' | 'OF' ); WS : ( ' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ; WORD : (~( ' ' | '\t' | '\r' | '\n' | '(' | ')' | '"' ))*; MINUS : '-'; PLUS : '+'; expr : andexpr; andexpr : orexpr (AND^ orexpr)*; orexpr : part (OR^ part)*; phrase : QUOTE ( options {greedy=false;} : . )* QUOTE; requiredexpr : PLUS atom; excludedexpr : MINUS atom; part : excludedexpr | requiredexpr | atom; atom : phrase | WORD | LPAREN! expr RPAREN!;
问题在于 MINUS 和 PLUS 标记与 AND 和 OR 标记中的 MINUS 和 PLUS 符号“冲突”。抱歉,如果我没有使用正确的术语。我是 ANTLR 新手。
下面是一个示例查询:
foo OR (pow AND -"bar with Cream" AND -bar)
我犯了什么错误?
I'm creating a simple boolean query parser. I would like to do something like this below.
grammar BooleanQuery; options { language = Java; output = AST; } LPAREN : ( '(' ) ; RPAREN : ( ')' ); QUOTE : ( '"' ); AND : ( 'AND' | '&' | 'EN' | '+' ) ; OR : ( 'OR' | '|' | 'OF' ); WS : ( ' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ; WORD : (~( ' ' | '\t' | '\r' | '\n' | '(' | ')' | '"' ))*; MINUS : '-'; PLUS : '+'; expr : andexpr; andexpr : orexpr (AND^ orexpr)*; orexpr : part (OR^ part)*; phrase : QUOTE ( options {greedy=false;} : . )* QUOTE; requiredexpr : PLUS atom; excludedexpr : MINUS atom; part : excludedexpr | requiredexpr | atom; atom : phrase | WORD | LPAREN! expr RPAREN!;
The problem is that the MINUS and PLUS tokens 'collide' with the MINUS and PLUS signs in the AND and OR tokens. Sorry if I don't use the correct terminology. I'm a ANTLR newbie.
Below an example query:
foo OR (pow AND -"bar with cream" AND -bar)
What mistakes did I make?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
令牌必须是唯一的。但是,您可以在语法中将同一标记用于多种用途(例如 Java 中的一元减号和二进制减号)。
我不知道您的环境的确切语法,但更改以下两个子句
可能
会解决此问题。
A token must be unique. You can, however, use the same token for several purposes in you syntax (like the unary and binary minus in Java).
I do not know the exact syntax of your environment, but something like changing the following two clauses
and
would probably solve this issue.