微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何解析具有对 DIGIT 的模糊标记引用的复数的 ANTLR 规则?

如何解决我如何解析具有对 DIGIT 的模糊标记引用的复数的 ANTLR 规则?

我有以下 ANTLR 规则来解析 float 复数,其中浮点数可以这样写:

  • 3
  • 3.0
  • 3f

并且 floati 应该可以互换(例如 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 举报,一经查实,本站将立刻删除。