2013-07-03 81 views
0

我挣扎了解ANTLR,我试图匹配这样一句话:ANTLR令牌匹配,而不是文本

name "some_name" module .... 

的grammare文件看起来像这样的:

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

词法分析器没有被解析器驱动。所以,你的输入"module"被符号化如下:

  • DBL_QUOTE
  • MODULE
  • DBL_QUOTE

,并为此不受解析器规则nameDecl: NAME DBL_QUOTE appName DBL_QUOTE;匹配。

... 

nameDecl : NAME STRING; 

...  

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

... 
+0

行,所以词法“标记化”我在“独立”与分析器输入莫名其妙:字符串文本通常是由词法分析器,在这种情况下,你不会有一个问题来处理。感谢Bart的回答,我需要将引号移动到令牌中,以便antlr可以正确识别引用的“STRING”。仍然为什么antlr试图匹配每个TOKEN,只有在它匹配解析器语法之后? – victor

+0

我想如何处理案件,当我想解析的东西没有引号 - >'名称模块模块',我想模块的第一次出现是名称,第二个模块是好的..模块令牌。谢谢 ! – victor