gpt4 book ai didi

java - 如果在我的表达之后需要词法分析器怎么办?

转载 作者:行者123 更新时间:2023-11-29 06:00:03 31 4
gpt4 key购买 nike

仍在使用 Antlr,我正在搜索在文档中找不到的内容。

这是一个可以检测字符串中“非”模式的解析器:

 factor : 'not'^ primary| primary;
(and some other lines).

但是如果我想在我的 primary 之后检测一个表达式怎么办?例如

B exists

如何定义一个解析器规则来搜索我的表达式的其余部分?我通过类比尝试了这个,但直到现在都无法让它发挥作用。

 exists : primary 'exists'^ | primary;

根据我在表达式中放置 exists 的位置,我得到了

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 ')'  

真的不是 self 解释

非常感谢您的帮助,我真的很难理解 antlr 文档网站 :s。

最佳答案

我怀疑您在其中一个解析器规则中放错了 EOF。您发布的规则似乎没有太大问题:至少,不会导致您发布的错误。

对于(可能的) future 问题(不仅是 ANTLR 问题),我强烈建议您发布一个“自包含”的语法(或示例代码)。换句话说:你发布了一个语法,别人可以很容易地在他们自己的机器上运行,而不需要修改它(!),这样他们就能看到你所看到的。现在它只是在猜测你的其他规则是什么样子的。

以下内容:

exists
: atom (Exists^)?
;

就像一个魅力,你可以测试自己:

grammar T;

options {
output=AST;
}

parse
: expr EOF -> expr
;

expr
: orexp
;

orexp
: andexp (Or^ andexp)*
;

andexp
: not (And^ not)*
;

not
: Not^ exists
| exists
;

exists
: atom (Exists^)?
;

atom
: Num
| Id
| '(' expr ')' -> expr
;

Or : 'or';
And : 'and';
Exists : 'exists';
Not : 'not';
Num : '0'..'9'+;
Id : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
Space : ' ' {skip();};

输入:

(A or B) and (not C or D exists) or not E exists

产生以下 AST:

enter image description here

编辑

您的主要规则的备选方案 1 和备选方案 2:

 primary
: atom (LIKE^ atom)* // alternative 1
| atom (EXISTS^)? // alternative 2
;

匹配单个atom。这是解析器无法正确解析您的输入的原因(并且需要您添加 backtrack=true;,这应该避免!)。

我没有测试它,但我很确定如果你从选项 block 中删除 backtrack=true; 并重写 primary 如下:

primary
: atom ( (LIKE^ atom)* // alternative 1
| EXISTS^ // alternative 2
)
;

现在备选方案 1 仅匹配单个 atom,并且没有歧义(至少,that 规则中没有)。

关于java - 如果在我的表达之后需要词法分析器怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10518905/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com