ANTLR4:解析整数和浮点数
ANLTR4: parse both integer and float
我正在尝试使用 ANLTR4 来解析 2 种类型的表达式:
- 对表达式是一对整数或浮点数数字,如
(1,2)
或(1.0 , 2.0)
。
- 单个表达式是单个整数
(1)
.
我的语法设计如下,但是
- 如果我在
NUM
之前写 INT
,像 (1, 2)
这样的整数对表达式不能被标记化,因为期望 NUM
;
- 如果我在
INT
之前写 NUM
,像 (1)
这样的单个表达式不能被标记化,因为需要 INT
.
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
提升为解析器规则。在词法分析器中定义 INT
和 FLOAT
没有多大意义,然后定义一个 NUM
使标记 INT
和 FLOAT
永远不会自己成为真正的代币。
prog : single | pair ;
single : '(' INT ')' ;
pair : '(' num ',' num ')' ;
num : INT | FLOAT ;
INT : [0-9]+ ;
FLOAT : '-'? INT '.' INT ;
WS : [ \t\r\n] -> skip ;
我正在尝试使用 ANLTR4 来解析 2 种类型的表达式:
- 对表达式是一对整数或浮点数数字,如
(1,2)
或(1.0 , 2.0)
。 - 单个表达式是单个整数
(1)
.
我的语法设计如下,但是
- 如果我在
NUM
之前写INT
,像(1, 2)
这样的整数对表达式不能被标记化,因为期望NUM
; - 如果我在
INT
之前写NUM
,像(1)
这样的单个表达式不能被标记化,因为需要INT
.
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
提升为解析器规则。在词法分析器中定义 INT
和 FLOAT
没有多大意义,然后定义一个 NUM
使标记 INT
和 FLOAT
永远不会自己成为真正的代币。
prog : single | pair ;
single : '(' INT ')' ;
pair : '(' num ',' num ')' ;
num : INT | FLOAT ;
INT : [0-9]+ ;
FLOAT : '-'? INT '.' INT ;
WS : [ \t\r\n] -> skip ;