繁体   English   中英

强制 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 = 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM