使用字符作为数字之间的运算符,否则将其视为令牌 ANTLR4

问题描述 投票:0回答:0

我在 ANTLR 中制作一种语言,其中数字序列是一个数字。然而,一系列数字、字母和下划线是标识符。所以,例如:

  • 这些是数字:
    234
    ,
    0243
    ,
    0
    ,
    11
  • 这些是标识符:
    foo
    2foo
    foo2
    2y8

但是,我也有运算符,比如乘法、加法、除法……它们都工作正常,除了一个运算符,它是科学运算符

e
(或
E
)。与大多数其他语言不同,科学数字的
e
被认为是数字本身的一部分(如
2e3
),在我的语言中,
e
被认为是运算符本身。因此,例如,
(2+5)e4
是有效的。

然而,这带来了一个问题:因为

e
是一个字母,除非我将我的科学数字分隔成空格,否则 ANTLR 将
2e3
识别为标识符而不是操作 2-e-3.

我希望语言始终将

e
视为运算符,而不是标识符的一部分,如果 e 两边的内容不是字母或下划线,或者它是单独的。所以,例如:

  • 以下被视为操作:
    , 
    2e3
    , 
    2 e 3
    
    
    以下被视为标识符:
    2E3
    , 
    2e 3
    , 
    2 e3
    , 
    23.4e78.9
    , 
    5e($my_var)
    , 
    .0e4
    , 
    -7e3
    .
    我有以下最小复制示例:
    7e+9
  • 据我了解,ANTLR 优先考虑产生最大可能结果的解析规则,这可能就是为什么它不优先考虑科学存在的原因。任何想法我可以如何设计这个所以优先考虑有效的科学表达,只要两个成员都是一个不是简单的标识符原子的表达式,或者缺少它?
    我考虑过对 IDENTIFIER 词法规则进行过度设计,但是由于 ANTLR 并没有真正的前瞻和后视表达式,所以我不完全确定我将如何实现。
        
    
    
parsing antlr antlr4 lex
© www.soinside.com 2019 - 2024. All rights reserved.