问题描述
我有以下 ANTLR 规则来解析 float
复数,其中浮点数可以这样写:
- 3
- 3.0
-
- 3f
并且 float
和 i
应该可以互换(例如 float i | i float)
这是 ANTLR 语法规则(它很丑,我知道,都在 1 行中):
floatComplex : SUB? (DIGIT+ 'f'|DIGIT+ DOT? (DIGIT+)?) (ADD|SUB) (I (DIGIT+ 'f'|DIGIT* DOT? (DIGIT+)?) | (DIGIT+ 'f'|DIGIT+ DOT? (DIGIT+)?) I)
DIGIT : [0-9] ;
ADD : '+' ;
SUB : '-' ;
DOT : '.' ;
I : 'i' ;
我不确定如何具体检索每个号码,有人知道如何检索吗?因为 ctx.DIGIT()
返回所有数字组合的列表,对吗?不是每个部分都专门 =o 然后我不确定如何在 .
或 +
或 -
符号等之前检索所有数字。
非常感谢任何帮助或想法
解决方法
我想这种方式要容易得多,因为我可以调用 ctx.NUMBER()
或 ctx.UNSIGNED()
来检查它们是否被给出:
// Parser rules
complexAtom : NUMBER? EXP POW (I UNSIGNED?|UNSIGNED I) # PolarComplex
| NUMBER? CIS UNSIGNED # CisComplex
| (NUMBER (ADD|SUB))? (I UNSIGNED?|UNSIGNED I) # Complex
;
// Lexer rules
NUMBER : INT
| FLOAT
;
UNSIGNED: DIGIT+ 'f'
| DIGIT+ DOT (DIGIT+)?
| DIGIT+
;
INT : SUB? DIGIT+ ;
FLOAT : INT DOT (DIGIT+)?
| INT 'f'
;
DIGIT : [0-9] ;
EXP: [Ee] ;
ADD : '+' ;
SUB : '-' ;
POW : '^' ;
DOT : '.' ;
CIS : 'cis' ;
I : 'i' ;
WS : [ \t]+ -> skip ;
编辑:我还想出了如何使用以下词法分析器语法让词法分析器直接解析为 COMPLEX
标记(最终我可以管理访问者代码中的实际解析):
// Lexer grammar
COMPLEX : SUB? IMAGINARY
| NUMBER (ADD|SUB) IMAGINARY
;
POLAR_COMPLEX : NUMBER? EXP POW IMAGINARY ;
CIS_COMPLEX : NUMBER? CIS UNSIGNED ;
UFLOAT : UINT (DOT UINT? | 'f') ;
FLOAT : SUB UFLOAT ;
UINT : DIGITS ;
INT : SUB UINT ;
CIS : 'cis' ;
IM : 'I' ;
ADD : '+' ;
SUB : '-' ;
POW : '^' ;
DOT : '.' ;
EXP : [Ee] ;
DIGITS : DIGIT+ ;
DIGIT : [0-9] ;
fragment IMAGINARY : IM UNSIGNED?
| UNSIGNED IM
;
fragment NUMBER : UFLOAT
| FLOAT
| UINT
| INT
;
fragment UNSIGNED : UFLOAT
| UINT
;
WS : [ \t]+ -> skip ;