当前位置: 首页 > 知识库问答 >
问题:

ANTLR4 lexer规则与正确的文本块不匹配

阚砚文
2023-03-14

我试图了解ANTLR4是如何基于lexer和解析器规则工作的,但我在下面的示例中遗漏了一些内容:

我正在尝试解析一个文件,并匹配所有的数学加法(例如1+2+3等)。我的文件包含以下文本:

start
4 + 5 + 22 + 1
other text other text test test
test test other text
55 other text
another text 2 + 4 + 255
number 44
end

我想和

4+5+22+1

而且

2+4+255

grammar Hello;
hi : expr+ EOF;
expr : NUM (PLUS NUM)+;

PLUS : '+' ;
NUM : [0-9]+ ;
SPACE : [\n\r\t ]+ ->skip;
OTHER : [a-z]+ ;

OTHER : [a-z]+ ->skip;

以上所述都与lexer匹配输入的方式有关?我知道lexer会查找第一个最长的匹配规则,但我如何更改语法以便只匹配添加的规则呢?

共有1个答案

拓拔俊艾
2023-03-14

为什么规则“expr”与文本“start”匹配?

它没有。当一个令牌在树中显示为红色时,这表示有错误。令牌与任何可能的备选项都不匹配,因此产生了一个错误,解析器继续使用下一个令牌。

此外,在上面的图像中,文本'55,其他文本,其他文本‘匹配作为AST中的节点的表达式。为什么会出现这种情况?

4 + 5 + 22 + 1 55 2 + 4 + 255 44

4+5+22+1可以解析为表达式,没有问题。之后,解析器需要一个+(继续表达式)或一个数字(开始一个新表达式)。因此,当它看到55时,这表示新表达式的开始。现在它需要+(因为语法规定加num必须在表达式中的第一个数字之后至少出现一次)。它实际得到的是数字2。因此它会产生一个错误并忽略该标记。然后它会看到一个+,这正是它所期望的。然后继续这样做,直到44,它再次开始一个新的表达式。由于后面没有+,这是另一个错误。

以上所述都与lexer匹配输入的方式有关?

不是真的。“start 4+5”的令牌序列是其他NUM加NUM,如果跳过其他,则只是NUM加NUM。“55 skippedtext 2+4”的令牌序列是NUM NUM PLUS NUM。我想这正是你所期待的。

 类似资料:
  • 基本模式匹配 一切从最基本的开始。模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如: ^once 这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was

  • 主要内容:基本模式匹配,字符簇,确定重复出现基本模式匹配 一切从最基本的开始。模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如: 这个模式包含一个特殊的字符 ^,表示该模式只匹配那些以 once 开头的字符串。例如该模式与字符串 "once upon a time" 匹配,与 "There once was

  • 7.1 基本模式匹配 一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如: ^once 这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once

  • 问题内容: 是的,您没看错。我需要能够从正则表达式 生成 随机文本的内容。因此,文本应该是随机的,但要与正则表达式匹配。看来它不存在,但我可能是错的。 仅举一个例子:该库将能够以“ ”作为输入,并生成诸如以下示例: abc abbbc bac 等等 更新:我自己创建了一些东西:Xeger。查看http://code.google.com/p/xeger/。 问题答案: 我刚刚创建了一个库来进行此操

  • 我使用wiremock来模拟某些请求及其相应的响应,但我试图添加一个正则表达式。不幸的是,这只会引发一个异常,表明请求不匹配。 我也试过了 我发送的请求是