antlr - 在范围和语法错误中使用 float ?

标签 antlr antlr3

我正在尝试使用 ANTLR 将 LALR 语法转换为 LL,但遇到了一些问题。到目前为止,我认为将表达式转换为自上而下的方法对我来说是直接的。问题是当我将 Range (1..10) 和 (1.0..10.0) 包含在 float 中时。

我尝试使用此处找到的答案,但不知何故,它甚至无法在我的代码中正确运行,更不用说解决一系列 float ,即(float..float)。 Float literal and range parameter in ANTLR

附件是我的语法示例,仅关注这个问题。

grammar Test;

options {
  language = Java;
  output = AST;
}

parse: 'in' rangeExpression ';'
     ;

rangeExpression : expression ('..' expression)?
                ;

expression : addingExpression (('=='|'!='|'<='|'<'|'>='|'>') addingExpression)*
           ;

addingExpression : multiplyingExpression (('+'|'-') multiplyingExpression)*
                 ;

multiplyingExpression : unaryExpression 
                        (('*'|'/'|'div') unaryExpression)*
                      ;

unaryExpression: ('+'|'-')* primitiveElement;   

primitiveElement : literalExpression
                 | id ('.' id)?
                 | '(' expression ')'
                 ;  

literalExpression : NUMBER
                  | BOOLEAN_LITERAL
                  | 'infinity'
                  ;              

id : IDENTIFIER
   ;

// L E X I C A L   R U L E S    
Range
 : '..'
 ;

NUMBER 
    : (DIGITS Range) => DIGITS          {$type=DIGITS;} 
    | (FloatLiteral) => FloatLiteral    {$type=FloatLiteral;}
    | DIGITS                            {$type=DIGITS;}
    ;   


// fragments
fragment FloatLiteral : Float;
fragment Float
 : DIGITS ( options {greedy = true; } : '.' DIGIT* EXPONENT?)
 | '.' DIGITS EXPONENT?
 | DIGITS EXPONENT
 ;

BOOLEAN_LITERAL : 'false' 
                | 'true'
                ;

IDENTIFIER : LETTER (LETTER | DIGIT)*;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;
fragment LETTER : ('a'..'z' | 'A'..'Z' | '_') ;
fragment DIGITS: DIGIT+;
fragment DIGIT : '0'..'9';
fragment EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;

它甚至不采取的任何原因:

in 10;

in 10.0;

提前致谢!

最佳答案

以下内容不正确:

  • 您在 literalExpression 规则中永远不会匹配 FloatLiteral
  • NUMBER 的每个替代方案中,您都会更改 token 的类型,因此永远不会创建 NUMBER token

这样的东西应该适用于 11..221.1..2.2:

...

literalExpression : INT
                  | BOOLEAN_LITERAL
                  | FLOAT
                  | 'infinity'
                  ;              

id : IDENTIFIER
   ;

// L E X I C A L   R U L E S    
Range
 : '..'
 ;

INT 
    : (DIGITS Range)=> DIGITS
    | DIGITS (('.' DIGITS EXPONENT? | EXPONENT) {$type=FLOAT;})?
    ; 

BOOLEAN_LITERAL : 'false' 
                | 'true'
                ;

IDENTIFIER : LETTER (LETTER | DIGIT)*;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;
fragment LETTER : ('a'..'z' | 'A'..'Z' | '_') ;
fragment DIGITS: DIGIT+;
fragment DIGIT : '0'..'9';
fragment EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
fragment FLOAT : ;

关于antlr - 在范围和语法错误中使用 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15006944/

相关文章:

c# - ANTLR 可与 C# 一起使用

css - 使用 ANTLR 解析 CSS - 边缘情况

c# - 用于解析规则的 C# 产品私有(private)方法的 ANTLR

antlr - OR 词法分析器表达式的 AST 重写规则

antlr3 - 如何在命令行中运行ANTLR 3.4?

c# - 如何操作 C# AST?

ANTLRWorks 1.4.3 无法正确读取扩展 ASCII 字符

c# - 错误 - 词法分析器规则 'xxxx' 中的操作必须是单个最外层 alt 的最后一个元素

即使不匹配,ANTLR 词法分析器规则也会消耗字符?

ANTLR - 允许不完整的语法