关于以下简化语法
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”。
是否可以使用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';
答案 0 :(得分:1)
词法分析器的工作方式是,当可以在给定输入上匹配多个规则时,它将根据以下条件决定使用哪个规则:
因此,由于您的KeySOME
规则出现在IDENT
的后面,因此它将永远不会被采用,因为任何与KeySOME
匹配的输入也会与IDENT
匹配,并且IDENT
首先出现
因此,您可以将KeySOME
移动到IDENT
之前,也可以完全删除规则,而直接在其位置使用'Some'
(即'Collection' 'Some' ':=' IDENT IDENT IDENT
)。 / p>