如何在不同的可选 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。
我将 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。