0

我正在努力理解 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 标记匹配。

4

1 回答 1

1

词法分析器不是由解析器驱动的。因此,您的输入"module"被标记如下:

  • DBL_QUOTE
  • MODULE
  • DBL_QUOTE

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

...

nameDecl : NAME STRING;

...    

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

...
于 2013-07-03T18:08:07.533 回答