2012-08-10 60 views
1

我是ANTLR的新手,并试图在ANTLRWorks1.4.3中使用语法。ANTLR试图在较长的标记内匹配令牌

command 
: 'go' SPACE+ 'to' SPACE+ destination 
; 

destination 
: (UPPER | LOWER) (UPPER | LOWER | DIGIT)* 
; 

SPACE 
: ' ' 
; 

UPPER 
: 'A'..'Z' 
; 

LOWER 
: 'a'..'z' 
; 

DIGIT 
: '0'..'9' 
; 

这似乎工作正常,除非'目标'包含前两个关键字'去'和'到'的字符。 举例来说,如果我给下面的命令:

go to Glasgo 

如下节点树显示:

enter image description here

我期待它来搭配填字作为目的地。

我甚至尝试过更改关键字,例如'travel'而不是'go'。在这种情况下,如果目的地有'tr',ANTLR就会抱怨。

任何想法为什么发生这种情况?以及如何解决这个问题?

在此先感谢。

回答

1

ANTLR词法分析器和解析器是严格分开的。您的输入首先被标记化,然后解析器规则对所述标记进行操作。

在你情况下,输入go to Glasgo被标记化成以下X标记:

  1. 'go'
  2. ' '(SPACE)
  3. 'to'
  4. 'G'(UPPER)
  5. 'l'(LOWER )
  6. 'a'(LOWER)
  7. 's'(LOWER)
  8. 'go'

留下一个 “悬空” 'go'关键字。这就是ANTLR的词法分析器的工作原理:你不能改变这一点。

,你的情况可能的解决方案是使destination一个词法规则,而不是一个解析器规则:导致

command 
: 'go' 'to' DESTINATION 
; 

DESTINATION 
: (UPPER | LOWER) (UPPER | LOWER | DIGIT)* 
; 

SPACE 
: ' ' {skip();} 
; 

fragment UPPER 
: 'A'..'Z' 
; 

fragment LOWER 
: 'a'..'z' 
; 

fragment DIGIT 
: '0'..'9' 
; 

enter image description here


如果你不完全确定两者的区别是什么,请看:Practical difference between parser rules and lexer rules in ANTLR?

更多fragment S:What does "fragment" mean in ANTLR?


PS。 Glasgo w

+0

非常感谢。现在更清楚了。 **如果一条规则仅由词法(由词法分析器产生)组成,那么将其作为词法分析规则。**这是否正确? – 2012-08-10 17:32:18

+0

@Atul,不,不一定(如果情况如此,那么就不会有任何解析规则)。例如,你的'command'也只是由标记组成,但是它应该保持一个解析器规则。把词法规则看作是你的语言的原子。 “目的地”只是一个单一的名称,因此应该是一个词法分析规则。但是,“命令”由多个其他(词法分析器)规则组成,并且应该是解析器规则。 – 2012-08-10 17:36:01

+0

好吧,明白了!再次感谢。 – 2012-08-10 17:41:25