【发布时间】:2018-06-22 10:54:53
【问题描述】:
关于以下简化语法
proof_command : 'Proof' 'using' collection '.';
collection : 'Collection' IDENT ':=' section_subset_expr
| 'Collection' KeySOME ':=' IDENT IDENT IDENT
;
KeySOME : 'Some';
(而 IDENT 只是 Java 中的常用标识符)我正在尝试解析以下内容:Proof using Collection Some := a b c . 这不起作用并导致以下错误消息:
不匹配的输入“a”需要“section_subset_expr”
这是因为 IDENT 当然也可以是“一些”。
有没有办法使用 Some 作为关键字和标识符,所以上面的表达式被正确解析?也许通过在集合规则中从 IDENT 中排除“Some”的语义谓词?但那会是什么样子呢?
IDENT : IDENT2;
fragment IDENT2 : FIRST_LETTER (SUBSEQUENT_LETTER)*;
fragment FIRST_LETTER : [a-z] | [A-Z] | '_' | UNICODE_LETTER;
fragment SUBSEQUENT_LETTER : [a-z] | [A-Z] | DIGIT | '_' | '"' | '\''| UNICODE_LETTER | UNICODE_ID_PART;
fragment UNICODE_LETTER : '\\' 'u' HEX HEX HEX HEX;
fragment UNICODE_ID_PART : '\\' 'u' HEX HEX HEX HEX;
fragment HEX : [0-9a-fA-F];
KeySOME : 'Some';
【问题讨论】:
-
相对于
KeySOME的定义,您在语法中的哪个位置定义IDENT? -
我在 IDENT 后面定义了它。我不知道这会有所作为。是吗?
标签: antlr4 keyword identifier ambiguity mismatch