如何解决我如何解析具有对 DIGIT 的模糊标记引用的复数的 ANTLR 规则?
我有以下 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 ;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。