请求优化用于区分单词、字母数字与数字的ANTLR语法
优化ANTLR语法实现精准Token识别
我来帮你优化这个ANTLR语法,让它能正确解析你给出的输入字符串,精准识别出单词(words)、字母数字标识符(alphanumeric)、数字(numbers)和特殊符号(specials)。当前语法存在几个核心问题:缺少字母数字类型的定义、规则冗余臃肿、括号符号定义颠倒,以及Token优先级不合理,导致无法正确识别UUID这类带连字符的串。
下面是优化后的完整语法:
grammar Expressions; // 解析器入口规则:接收所有Token序列直到结束 parse : token+ EOF ; // 统一Token类型枚举 token : WORDS | ALPHANUMERIC | NUMBERS | SPECIALS ; // 词法规则:优先级从高到低排列,特殊规则在前 ALPHANUMERIC : [a-zA-Z0-9]+ ( '-' [a-zA-Z0-9]+ )+ // 匹配带连字符的字母数字串(如UUID) ; WORDS : [a-zA-Z]+ // 纯字母组成的单词 ; NUMBERS : [0-9]+ ( '.' [0-9]+ )? // 整数或小数,调整顺序避免歧义 ; // 合并所有特殊符号到一个规则,便于维护 SPECIALS : '&&' | '||' | '==' | '=' | '>' | '<' | '>=' | '<=' | '!=' | '!' | '+' | '-' | 'if' | ':' | '[' | ']' | '(' | ')' | '.' ; // 跳过空白字符 WS : [ \t\r\n]+ -> skip ;
关键优化细节:
- 新增
ALPHANUMERIC规则:专门匹配UUID这类带连字符的字母数字组合,并且放在词法规则最前面——ANTLR会优先匹配更长、更特殊的规则,这样就能避免UUID被拆分成数字和减号。 - 简化解析器规则:用极简的
parse和token规则替代原来冗余复杂的expression规则,完全贴合你逐Token识别的需求,可读性和维护性大幅提升。 - 修正特殊符号错误:把原来颠倒的括号定义(
FLB和FRB)修正为正确的(和),同时把所有特殊符号合并到SPECIALS规则中,不用再单独维护多个零散的符号规则。 - 优化数字规则:调整
NUMBERS的匹配顺序,先匹配整数再匹配小数,避免解析时出现歧义。 - 精简单词规则:用
[a-zA-Z]+替代原来的[a-zA-Z][a-zA-Z]*,效果完全一致但写法更简洁。
测试你的目标输入
针对你提供的输入字符串:
SYS [ErrorCode is not Available] : Transaction ID: d9d1211e-d273-40e1-bdd0-e4c9a8036ef3 . This can be ignored safely to: map To Not availble : works in progress
解析后的Token序列完全符合你的预期:
- WORDS → SYS
- SPECIALS → [
- WORDS → ErrorCode
- WORDS → is
- WORDS → not
- WORDS → Available
- SPECIALS → ]
- SPECIALS → :
- WORDS → Transaction
- WORDS → ID
- SPECIALS → :
- ALPHANUMERIC → d9d1211e-d273-40e1-bdd0-e4c9a8036ef3
- SPECIALS → .
- WORDS → This
- WORDS → can
- WORDS → be
- WORDS → ignored
- WORDS → safely
- WORDS → to
- SPECIALS → :
- WORDS → map
- WORDS → To
- WORDS → Not
- WORDS → availble
- SPECIALS → :
- WORDS → works
- WORDS → in
- WORDS → progress
内容的提问来源于stack exchange,提问作者Raihan Wadud
相关产品推荐
相关产品推荐

