1

我正在尝试解析 Java 风格的浮点数(接受数字中间的下划线)并简化了Java 规范中的语法:

float_lit = [[DIGITS] '.'] DIGITS [FLOAT_EXP] [FLOAT_SUFFIX] ;

DIGITS = /\d[\d_]*\d/ | /\d/ ;
FLOAT_EXP = ( 'e' | 'E' ) [ '+' | '-' ] DIGITS ;
FLOAT_SUFFIX = 'f' | 'F' | 'd' | 'D' ;

不幸的是,这不接受“1e10”输入,奇怪的是无法匹配 FLOAT_EXP 中的“e”,如下面的跟踪所示:

<float_lit ~1:1
1e10
<DIGITS<float_lit ~1:1
1e10
!'' /\d[\d_]*?\d/
1e10
>'1' /\d/
e10
>DIGITS<float_lit ~1:2
e10
!'.'
e10
<DIGITS<float_lit ~1:1
1e10
>DIGITS<float_lit ~1:2
e10
<FLOAT_EXP<float_lit ~1:2
e10
!'e'
e10
!'E'
e10
!FLOAT_EXP<float_lit ~1:2
e10
<FLOAT_SUFFIX<float_lit ~1:2
e10
!'f'
e10
!'F'
e10
!'d'
e10
!'D'
e10
!FLOAT_SUFFIX<float_lit ~1:2
e10
>float_lit ~1:2
e10
'1'

谁能指出我做错了什么?

4

1 回答 1

1

这里的问题是 Tatsu 的代币护名。由于令牌后面的字符是字母数字,因此它不匹配以防止急切地消耗令牌。

解决方案是使用正则表达式而不是标记选择来匹配这些字符:

float_lit    = [[DIGITS] '.'] DIGITS [FLOAT_EXP] [FLOAT_SUFFIX] ;
DIGITS       = /\d[\d_]*\d/ | /\d/ ;
FLOAT_EXP    = /[eE][+-]?/ DIGITS ;
FLOAT_SUFFIX = /[fFdD]/ ;
于 2021-07-22T13:20:06.940 回答