ANTLR4:解析整数和浮点数

ANLTR4: parse both integer and float

我正在尝试使用 ANLTR4 来解析 2 种类型的表达式:

  1. 对表达式是一对整数或浮点数数字,如(1,2)(1.0 , 2.0)
  2. 单个表达式是单个整数 (1).

我的语法设计如下,但是

grammar Expr;

prog   : single | pair ;
single : '(' INT ')' ;
pair   : '(' NUM ',' NUM ')' ;

INT   : [0-9]+ ;
NUM   : INT | FLOAT ;
FLOAT : '-'? INT '.' INT ;
WS    : [ \t\r\n] -> skip ;

为了使两个表达式都能够被标记化,我可以删除 NUM 词法分析器并手动编写 pair 如:

pair : '(' INT   ',' INT   ')'
     | '(' INT   ',' FLOAT ')'
     | '(' FLOAT ',' INT   ')'
     | '(' FLOAT ',' FLOAT ')'
     ;

那么两个表达式都可以解析,pair表达式支持整型和浮点型

但是这很愚蠢,因为如果不是 pair 而是 tuple10,就不可能写出 1024 个案例。

有没有更好的解决方案?

正如 kaby76 在评论中提到的那样:将 NUM 提升为解析器规则。在词法分析器中定义 INTFLOAT 没有多大意义,然后定义一个 NUM 使标记 INTFLOAT永远不会自己成为真正的代币。

prog   : single | pair ;
single : '(' INT ')' ;
pair   : '(' num ',' num ')' ;
num    : INT | FLOAT ;

INT    : [0-9]+ ;
FLOAT  : '-'? INT '.' INT ;
WS     : [ \t\r\n] -> skip ;