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 : '.';
关键调整说明
- 拆分符号规则:从
SYMBOL中移除.和-,保留独立的DOT和MINUS规则。这样数字语法里的小数点/负号能被精准识别,字符串里的.和-也能通过string规则中的显式包含被正确匹配。 - 优化数字匹配规则:调整
numberLiteral,支持整数、带前导/后缀小数点的小数以及负数,覆盖更多常见数字格式。 - 扩展字符串允许的字符:在
string规则中加入DOT和MINUS,确保字符串内的点和减号能被正常解析。
验证效果
修改后可同时正确解析:
str = "sentence. more.";:字符串内的.会被识别为DOT,纳入字符串内容num = 5.5;:数字中的.会被识别为DOT,配合前后NUM组成合法的numberLiteral
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

