【问题标题】:Is there a way to improve this ANTLR 3 Grammar for positive and negative integer and decimal numbers?有没有办法改进正负整数和十进制数的这个 ANTLR 3 语法?
【发布时间】:2011-08-26 15:54:54
【问题描述】:

有没有办法用可选的正负号以较少重复的方式表达这一点?

我想要完成的是如何在可选地具有指数和/或小数部分的数字文字上表示可选地提供正 +(默认)和负 - 符号。

NUMBER : ('+'|'-')? DIGIT+ '.' DIGIT* EXPONENT?
       | ('+'|'-')? '.'? DIGIT+ EXPONENT?
       ;

fragment 
EXPONENT : ('e' | 'E') ('+' | '-') ? DIGIT+ 
         ;

fragment
DIGIT  : '0'..'9' 
       ;

我希望能够识别NUMBER 模式,并且那时我不太关心这些数字的算术运算,我稍后会,但我正在尝试了解如何识别任何 NUMBER literals 数字看起来像:

123
+123
-123
0.123
+.123
-.123
123.456
+123.456
-123.456
123.456e789
+123.456e789
-123.456e789 

以及我没有想到的任何其他标准格式。

【问题讨论】:

    标签: numbers integer decimal grammar antlr3


    【解决方案1】:

    回答您的问题:不,没有办法改进此 AFAIK。您可以将('+' | '-') 放在片段规则中并使用该片段,就像指数片段一样,但我不会称之为真正的改进。

    请注意,一元 +- 符号通常不是数字标记的一部分。考虑输入源"1-2"。您不希望将其标记为 2 个数字:NUMBER[1]NUMBER[-2],而是作为 NUMBER[1]MINUS[-]NUMBER[2],以便您的解析器包含以下内容:

    parse
      :  statement+ EOF
      ;
    
    statement
      :  assignment
      ;
    
    assignment
      :  IDENTIFIER '=' expression
      ;
    
    expression
      :  addition
      ;
    
    addition
      :  multiplication (('+' | '-') multiplication)*
      ;
    
    multiplication
      :  unary (('*' | '/') unary)*
      ;
    
    unary
      :  '-' atom
      |  '+' atom
      |  atom
      ;
    
    atom
      :  NUMBER
      |  IDENTIFIER
      |  '(' expression ')'
      ;
    
    IDENTIFIER
      :  ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | DIGIT)*
      ;
    
    NUMBER 
      :  DIGIT+ '.' DIGIT* EXPONENT?
      |  '.'? DIGIT+ EXPONENT?
      ;
    
    fragment 
    EXPONENT 
      :  ('e' | 'E') ('+' | '-') ? DIGIT+ 
      ;
    
    fragment
    DIGIT  
      :  '0'..'9' 
      ;
    

    因此addition 将匹配输入"1-2"

    编辑

    111.222 + -456 这样的表达式将被解析为:

    +123 + -456 为:

    【讨论】:

    • @Jarrod,但是你将如何解析1--2?我的建议可以妥善处理。
    • ...和- 3(减去空格号)?
    • 您的示例中NUMBER 的定义是什么样的,如果没有该示例,我不明白它是如何工作的。
    • @Jarrod,是的,这有点令人困惑。在我的示例中添加了词法分析器规则。
    • @Jarrod,我在示例语法中添加了一些规则。
    猜你喜欢
    • 2018-01-19
    • 2018-06-29
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多