“令牌冲突”在布尔查询解析器中

发布于 2024-09-15 06:38:07 字数 857 浏览 3 评论 0原文

我正在创建一个简单的布尔查询解析器。我想做下面这样的事情。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千紇 2024-09-22 06:38:07

令牌必须是唯一的。但是,您可以在语法中将同一标记用于多种用途(例如 Java 中的一元减号和二进制减号)。

我不知道您的环境的确切语法,但更改以下两个子句

AND : ( 'AND' | '&' | 'EN' ) ;

可能

andexpr : orexpr ((AND^ | PLUS^) orexpr)*;

会解决此问题。

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 : ( 'AND' | '&' | 'EN' ) ;

and

andexpr : orexpr ((AND^ | PLUS^) orexpr)*;

would probably solve this issue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文