如何在不同的可选 Lexer 标记中使用相同的词

How to use same word in different optional Lexer tokens

我将 Antlr4 语法简化为:

grammar test;

directives:
    ('[' directive ']')* EOF;


directive:      
      KEY1 OPERATOR OPTIONS1
    | KEY2 OPERATOR OPTIONS2;
OPERATOR: '=';

KEY1: 'Key1';
KEY2: 'Key2';

OPTIONS1: 'a'|'b'|'c';
OPTIONS2: 'c'|'d'|'e';

当我尝试使用此语法进行解析时:

[Key1=a][Key2=c]

解析器报错:

line 1:14 mismatched input 'c' expecting OPTIONS2

在我的实际工作中,OPTIONS1 和 OPTIONS2 是不同的枚举数据类型,'c' 是两者中的一种。

你应该分割路口:

OPTIONS1: 'a'|'b'|'c';
OPTIONS2: 'c'|'d'|'e';

因此,您的规则将是:

OPTIONS1: 'a'|'b';
OPTIONS2: 'd'|'e';
OPTIONS3: 'c';

和:

directive:      
      KEY1 OPERATOR (OPTIONS1 | OPTIONS3)
    | KEY2 OPERATOR (OPTIONS2 | OPTIONS3)

发生这种情况是因为 Lexer 从树叶中执行标记识别,因此,您的 'c' 被 lexer 按语法顺序解释为 OPTIONS1 而不是 OPTIONS2。

我忘记了如何内联你的标记(解释为宏),所以它在预处理器中看起来像这样(它也可以工作):

directive:      
      KEY1 OPERATOR ('a'|'b'|'c')
    | KEY2 OPERATOR ('c'|'d'|'e');

你最好阅读他们当前的语法,它可以被内联。缺点是您不会在 AST 视图中看到 OPERATOR1 和 OPERATOR2。