Antlr匹配[a-z]+规则失败 无法拆分输入首个单词问题咨询
匹配失败的核心原因
Antlr的词法分析器遵循最长匹配优先原则:会优先选择能匹配最长输入序列的词法规则,只有当多个规则匹配长度完全相同时,才会按规则定义的先后顺序选择靠前的规则。
你的语法里ANYTHING : .+;可以匹配任意长度≥1的字符序列,对于输入asdf asdf,ANYTHING能匹配完整的整行内容,匹配长度远长于HEADWORD能匹配的4个字符,所以词法分析器直接将整个输入识别为ANYTHING类型的Token,根本不会生成HEADWORD类型的Token,语法规则匹配时自然会报HEADWORD缺失。
死循环的原因
单独测试HEADWORD规则时,所有输入内容都会被ANYTHING规则匹配,词法分析器始终无法输出HEADWORD类型的Token,测试程序会一直等待符合要求的Token输入,看起来就像进入了死循环。
另外你设置的SPACE : [ \t]+ -> skip ;规则会把所有空格直接丢弃,如果你需要保留释义部分的空格,这个设置也不符合需求。
修复后的参考语法
可以用词法模式实现需求,匹配完首个单词后切换到释义模式,避免规则冲突:
grammar Hello; entry : headword definition EOF ; headword: HEADWORD; definition: DEFINITION_CONTENT; // 默认模式:匹配首个单词 HEADWORD: [a-z]+; // 首个单词后的空格,跳过的同时切换到释义模式 POST_HEAD_SPACE: [ \t]+ -> skip, pushMode(DEFINITION_MODE); mode DEFINITION_MODE; // 释义模式下所有剩余内容都作为释义文本 DEFINITION_CONTENT: .+;
内容的提问来源于stack exchange,提问作者Sergey Slepov
相关产品推荐
相关产品推荐

