词法分析器规则冲突
Conflict in lexer rules
我正在尝试使用 ANTLR4 解析一个文件,其中元素可以是字符 "b"
或简单的文字,当文字只是一个带有 "b"
的字符时就会出现问题。
这是一个简化的语法
词法分析器文件:
B
: 'b'
;
LETTER
: [a-z]
;
LETTERS
: LETTER+
;
Parser file:
pointer
: B '.' LETTERS
;
b.f
有效,但 b.b
无效,我得到 "line 1:2 mismatched input 'b' expecting LETTERS"
。如果不把 Letter 放在 B 上面,如何避免两个词法规则之间的冲突,问题只会变成 B
.
首先请注意,问题不仅会出现在 b
上,还会出现在任何单个字母上。 b
以外的字母将简单地由 LETTER
规则匹配,这仍然与 LETTERS
不同。由于您实际上从未使用过 LETTER
,因此您可以通过简单地从语法中完全删除 LETTER
来解决这部分问题。
就 B
而言,这就是所谓的上下文关键字:与标识符规则(或本例中的 LETTERS
)匹配的内容应特殊处理在某些位置,但仍被允许在其他位置用作标识符。实现上下文关键字的常用方法是为可以匹配实际标识符或任何语言的上下文关键字的标识符定义 non-terminal。所以在你的情况下,你可以这样做:
letters: LETTERS | B; // You can add "| LETTER" if you want to keep LETTER
pointer: B '.' letters;
我正在尝试使用 ANTLR4 解析一个文件,其中元素可以是字符 "b"
或简单的文字,当文字只是一个带有 "b"
的字符时就会出现问题。
这是一个简化的语法
词法分析器文件:
B
: 'b'
;
LETTER
: [a-z]
;
LETTERS
: LETTER+
;
Parser file:
pointer
: B '.' LETTERS
;
b.f
有效,但 b.b
无效,我得到 "line 1:2 mismatched input 'b' expecting LETTERS"
。如果不把 Letter 放在 B 上面,如何避免两个词法规则之间的冲突,问题只会变成 B
.
首先请注意,问题不仅会出现在 b
上,还会出现在任何单个字母上。 b
以外的字母将简单地由 LETTER
规则匹配,这仍然与 LETTERS
不同。由于您实际上从未使用过 LETTER
,因此您可以通过简单地从语法中完全删除 LETTER
来解决这部分问题。
就 B
而言,这就是所谓的上下文关键字:与标识符规则(或本例中的 LETTERS
)匹配的内容应特殊处理在某些位置,但仍被允许在其他位置用作标识符。实现上下文关键字的常用方法是为可以匹配实际标识符或任何语言的上下文关键字的标识符定义 non-terminal。所以在你的情况下,你可以这样做:
letters: LETTERS | B; // You can add "| LETTER" if you want to keep LETTER
pointer: B '.' letters;