antlr4 - 如何匹配没有空格分隔的序列
问题描述
我要匹配的规则是:hello
后跟一系列字符。如果该序列中包含一个字母,那么它应该匹配str
规则,否则它应该匹配num
规则。
例如
hello123
- 123 应该由 num 规则匹配
hello1a3
- 1a3 应该由 str 规则匹配
我写的语法如下:
grammar Hello;
r: 'hello'seq;
// seq: str | integ;
seq: num | str;
num : DIGITS;
str : CHARS;
DIGITS: [0-9]+;
CHARS : [0-9a-zA-Z]+;
WS : [ \t\n\r]+ -> skip;
在尝试可视化解析树(使用 grun)(针对上面的第一个输入示例)时,我得到了以下解析树:
但是,如果输入之间有空格,则没有问题。请解释错误的原因。
解决方案
ANTLR(以及大多数词法分析器生成器)中的词法分析根据最大 munch 规则工作,这表示它始终应用可以匹配当前输入的最长前缀的词法分析器规则。对于输入hello123
,规则'hello'
将匹配hello
,而规则CHARS
将匹配整个输入hello123
。因此CHARS
产生较长的匹配并被选中'hello'
。
如果你的CHARS
andDIGITS
标记只能出现在一个'hello'
标记之后,你可以使用词法分析器模式来使这些规则只有在 a'hello'
匹配后才可用。
否则,要获得您想要的行为,您最好的选择可能是创建一个匹配的单个词法分析器规则,'hello' [0-9a-zA-Z]*
然后在单独的步骤中分解由该规则生成的标记。虽然这一切都取决于你为什么需要这个。
推荐阅读
- python - 即使调用了 model.to(device),torch 模块的某些成员也不会移动到 GPU
- matlab - 使用matlab去除结构中的字段
- linux - 有谁知道如何查看 cpython-37m-x86_64-linux-gnu.so?
- json - 如何将多个请求(http 方法:PUT)发送到单个端点
- c - 为什么我不能比较这两个字符串?字符串输入是一样的,但是总是返回false
- spring-boot - onErrorResume() 不会被调用
- angular - Angular HttpClient 响应对象不包含可以在浏览器网络选项卡中以及当我使用 PostMan 时看到的标题
- cassandra - 我们可以从使用 Cassandra Java 驱动程序的 Java 代码中导出/转换等效的 CQL 吗?
- android - 如何在 Android 中检测到人脸后将图像下载到图库?
- java - 如何在文件读取期间动态映射 SpringBatch 中的字段集?