[英]Force ANTLR (version 3) to match lexer rule
我有以下 ANTLR(版本 3)语法:
grammar GRM;
options
{
language = C;
output = AST;
}
create_statement : CREATE_KEYWORD SPACE_KEYWORD FILE_KEYWORD SPACE_KEYWORD value -> ^(value);
value : NUMBER | STRING;
CREATE_KEYWORD : 'CREATE';
FILE_KEYWORD : 'FILE';
SPACE_KEYWORD : ' ';
NUMBER : DIGIT+;
STRING : (LETTER | DIGIT)+;
fragment DIGIT : '0'..'9';
fragment LETTER : 'a'..'z' | 'A'..'Z';
使用此语法,我能够成功解析CREATE FILE dump
或CREATE FILE output
等字符串。 但是,当我尝试解析像CREATE FILE file
这样的字符串时,它不起作用。 ANTLR 将文本file
(在字符串中)与词法分析器规则FILE_KEYWORD
匹配,这不是我所期望的匹配。 我期待它与词法分析器规则STRING
匹配。
如何强制 ANTLR 执行此操作?
您的问题似乎是经典上下文关键字与标识符问题的变体。
“值”应该是词法分析器规则,而不是解析器规则,否则为时已晚,或者您应该重新排序规则(或两者兼而有之)。
因此使用VALUE = NUMBER | STRING
VALUE = NUMBER | STRING
(词法分析器规则)而不是小写value
(语法规则)会有所帮助。 词法分析器规则的顺序也很重要,通常 ID 的定义(代码中的“VALUE”)在关键字定义之后。
另请参阅: “IDENTIFIER”规则还使用 ANTLR Lexer 语法中的关键字
grammar GMR;
options
{
language = C;
output = AST;
}
create_statement : CREATE_KEYWORD SPACE_KEYWORD FILE_KEYWORD SPACE_KEYWORD value -> ^(value);
CREATE_KEYWORD : 'CREATE';
FILE_KEYWORD : 'FILE';
value : (LETTER | DIGIT) + | FILE_KEYWORD | CREATE_KEYWORD ;
SPACE_KEYWORD : ' ';
这对我在 ANTLRworks 中适用于输入CREATE FILE file
和输入CREATE FILE FILE
(如果需要)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.