You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ANTLR4语法解析问题:同时处理字符串与数字中的点和减号

解决ANTLR4中含点字符串与数字的解析冲突问题

问题根源

你的语法核心冲突在于:

  • SYMBOL规则包含了.和-,同时又单独定义了DOT和MINUS,ANTLR词法分析遵循最长匹配+规则顺序优先,导致两种符号无法同时满足数字和字符串的解析需求。
  • 字符串规则里的SYMBOL和单独的DOT/MINUS规则重叠,无论调整顺序,都会导致其中一种场景解析失败。

修改后的完整语法

// Parser rules
rule : statement*;
statement : assignmentStatement;
assignmentStatement : identifier '=' numberLiteral ';' 
                    | identifier '=' stringLiteral ';'
                    ;
// 支持整数、小数(含.5、5.、5.5三种格式)、负数字
numberLiteral : MINUS? (NUM+ DOT NUM+ | DOT NUM+ | NUM+);
stringLiteral : '"' string '"';
// 字符串允许包含字符、数字、符号、点、减号
string : (CHAR | NUM | SYMBOL | DOT | MINUS)+;
identifier : UNDERSCORE? (CHAR | NUM)+;

// Lexer rules
WS : (' ' | '\t' | '\r' | '\n')+ -> skip;
CHAR : [a-zA-Z];
NUM : [0-9];
// 移除SYMBOL中的.和-,避免与单独的DOT、MINUS规则冲突
SYMBOL : [<>#=&|!(){}\:;];
MINUS : '-';
UNDERSCORE : '_';
DOT : '.';

关键调整说明

  1. 拆分符号规则:从SYMBOL中移除.和-,保留独立的DOT和MINUS规则。这样数字语法里的小数点/负号能被精准识别,字符串里的.和-也能通过string规则中的显式包含被正确匹配。
  2. 优化数字匹配规则:调整numberLiteral,支持整数、带前导/后缀小数点的小数以及负数,覆盖更多常见数字格式。
  3. 扩展字符串允许的字符:在string规则中加入DOT和MINUS,确保字符串内的点和减号能被正常解析。

验证效果

修改后可同时正确解析:

  • str = "sentence. more.";:字符串内的.会被识别为DOT,纳入字符串内容
  • num = 5.5;:数字中的.会被识别为DOT,配合前后NUM组成合法的numberLiteral

内容的提问来源于stack exchange,提问作者Patrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:45:24