强制 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 dump
或 CREATE 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
(如果需要)有效。
我有以下 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
(语法规则)会有所帮助。词法分析器规则的顺序也很重要,通常 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
(如果需要)有效。