java - ANTLR 匹配标识符但不匹配保留关键字

标签 java parsing antlr4 identifier

我正在尝试使用不同的符号来匹配复数,其中之一使用 cis 函数,如下所示:MODULUS cis PHASE

问题是我的标识符规则与 cis 及其后面的数字的开头相匹配,并且由于它比 CIS token 本身大,因此它总是返回一个标识符标记类型。我怎样才能避免这种情况?

语法如下:

grammar Sandbox;

input : number? CIS UNSIGNED 
    | IDENTIFIER
    ;

number : FLOAT
    | UFLOAT 
    | UINT
    | INT
    ;

fragment DIGIT : [0-9] ;

UFLOAT : UINT (DOT UINT? | 'f') ;
FLOAT : SUB UFLOAT ;
UINT : DIGITS ;
INT : SUB UINT ;
UNSIGNED : UFLOAT 
    | UINT 
    ;
DIGITS : DIGIT+ ;

// Specific lexer rules
CIS : 'cis' ;
SUB : '-' ; 
DOT : '.' ;
WS : [ \t]+ -> skip ;
NEWLINE : '\r'? '\n' ;

IDENTIFIER : [a-zA-Z_]+[a-zA-Z0-9_]* ;  // has to be after complex so i or cis doesn't match this first

编辑: 我试图解析的输入是复杂的 1+i 但使用它各自的模数和相位,如下所示:1.4142135623730951cis0.7853981633974483

我的实际问题是 IDENTIFIER 规则匹配 cis0 而不是仅仅匹配 CIS 词法分析器规则,即使它是在它之前定义的。

我隐约知道 ANTLR 根据最大​​匹配来选择规则,但在这种情况下我想避免这种情况=o。

最佳答案

我在这里看到两个解决方案:

  1. 将复数设为单个词法分析器规则:
COMPLEX:  (FLOAT | UFLOAT | UINT | INT) WS* CIS WS* UNSIGNED;

它将比标识符或 pur CIS 关键字长(因此首先匹配)。

  • cis 序列是一个关键字,当它跟在数字后面时(数字之间有可选的空格),对吗?因此,您可以在谓词中进行回溯(LA(-1)),以在条件成立时拒绝 cis 作为标识符。
  • 我更喜欢解决方案 1,因为约定是单个实体(复数是,如 float 或字符串,单个逻辑实体)在词法分析器规则中完全匹配,而不是在解析器规则中.

    关于java - ANTLR 匹配标识符但不匹配保留关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65863023/

    相关文章:

    java - LinkedBlockingQueue 的插入和删除方法是线程安全的吗?

    parsing - Unix 命令行选项语法

    java - 有没有办法在文本 block 中查找位置名称

    java - 写入命令在 ANTLR 4 中不是可选的

    java - 如何将字节数组映射写入 ZIP 文件

    java - 无法通过 Java 应用程序连接到 Hive

    java - 将 JLabel 放置在面板的中央,将 JLabel 放置在同一面板的右侧

    python - 如何从 Python 中的 YouTube 链接中提取视频 ID?

    c# - 将 LeftBracket 之后的所有内容解释为字符串,直到下一个 RightBracket

    c# - 将预处理层添加到 ANTLR4 而不删除 token 的偏移量