如何明确匹配部分完整浮点数?以ANTLR4处理2.at(0)场景为例
解决ANTLR4中
2.at(0)的浮点数误匹配问题 要让ANTLR4将2.at(0)中的2.不识别为省略末尾0的浮点数,核心是打破词法分析的贪婪匹配逻辑,明确区分“浮点数后缀的小数点”和“成员访问的小数点”,具体可以通过以下方式实现:
修改词法规则,添加语义谓词约束
调整浮点数(FLOAT)的定义,仅当小数点后无数字时,后续字符不是字母/标识符起始字符的情况下,才匹配为浮点数。同时单独定义成员访问用的小数点(DOT):// 词法规则 FLOAT : DIGIT+ '.' DIGIT+ // 标准浮点数,如2.0、3.14 | '.' DIGIT+ // 起始小数点的浮点数,如.5、.123 | DIGIT+ '.' {!Character.isLetter(_input.LA(1))}? // 仅当后续非字母时,才匹配2.这类形式 ; INT : DIGIT+; DOT : '.'; ID : [a-zA-Z_][a-zA-Z0-9_]*; fragment DIGIT : [0-9];语义谓词
{!Character.isLetter(_input.LA(1))}?会检查当前匹配位置的下一个字符,若为字母则放弃FLOAT匹配,转而将2识别为INT,.识别为DOT。在语法规则中支持数字后的成员调用
补充语法规则,明确处理“数字 + 小数点 + 方法调用”的结构:// 语法规则 expr : expr '.' ID '(' expr ')' # MemberCallExpr | INT # IntLiteralExpr | FLOAT # FloatLiteralExpr ;
这样处理既能保证匹配的明确性:
- 当
2.后接数字、空格或运算符时(如2. + 3、2.0),仍正常识别为浮点数; - 当
2.后接字母(如2.at(0))时,会被拆分为整数、小数点和方法调用的结构,不会消耗后续的attoken。
内容的提问来源于stack exchange,提问作者Zeks
相关产品推荐
相关产品推荐

