强制 ANTLR(版本 3)匹配词法分析器规则

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 dumpCREATE FILE output 这样的字符串。但是,当我尝试解析像 CREATE FILE file 这样的字符串时,它不起作用。 ANTLR 将文本 file(在字符串中)与词法分析器规则 FILE_KEYWORD 匹配,这不是我期望的匹配。我期待它与词法分析器规则匹配 STRING.

我怎样才能强制 ANTLR 这样做?

您的问题似乎是经典上下文关键字与标识符问题的变体。

“值”应该是词法分析器规则,而不是解析器规则,否则就太晚了,或者您应该重新排序规则(或两者)。

因此使用 VALUE = NUMBER | STRING(词法规则)而不是小写 value(语法规则)会有所帮助。词法分析器规则的顺序也很重要,通常 ID 的定义(代码中的“VALUE”)在关键字定义之后。

另请参阅:'IDENTIFIER' rule also consumes keyword in ANTLR Lexer grammar

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(如果需要)有效。