antlr匹配令牌而不是文本

时间:2013-07-03 17:45:21

标签: antlr

我很难理解ANTLR,我正试图匹配这句话:

name "some_name" module ....

语法文件如下所示:

swdFile : nameDecl  module* EOF;

nameDecl:  NAME DBL_QUOTE appName DBL_QUOTE;

appName: TEXT;

module: MODULE;


DBL_QUOTE : '\"';
NAME:'name';
MODULE:'module';
TEXT : ('a'..'z'|'A'..'Z')+ ;

这很好用,但有一个小故障,我似乎无法理解。如果我尝试解析此文本,则会失败,因为它将引用的文本作为标记匹配:

name "module" module ... 

为什么?我特意告诉它,引号之间的内容是纯文本,它应该匹配TEXT令牌。

1 个答案:

答案 0 :(得分:1)

词法分析器不会驱动词法分析器。所以你的输入"module"被标记为如下:

  • DBL_QUOTE
  • MODULE
  • DBL_QUOTE

因此与解析器规则nameDecl: NAME DBL_QUOTE appName DBL_QUOTE;不匹配。字符串文字通常由词法分析器处理,在这种情况下,您不会遇到问题:

...

nameDecl : NAME STRING;

...    

STRING : '"' ~'"'* '"';
NAME   : 'name';
MODULE : 'module';

...