1

我是 ANTLR 的新手,并尝试在 ANTLRWorks1.4.3 中遵循语法。

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

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

SPACE
:   ' '
;

UPPER
:   'A'..'Z'
;

LOWER
:   'a'..'z'
;

DIGIT
:   '0'..'9'
;

这似乎工作正常,除非'destination' 包含关键字'go' 和'to' 的前两个字符。例如,如果我给出以下命令:

go to Glasgo

节点树显示如下:

在此处输入图像描述

我期待它匹配填充词作为目的地。

我什至尝试更改关键字,例如“旅行”而不是“去”。在这种情况下,如果目的地中有“tr”,ANTLR 会抱怨。

知道为什么会这样吗?以及如何解决这个问题?

提前致谢。

4

1 回答 1

1

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

在您的情况下,输入go to Glasgo被标记为以下 X 标记:

  1. 'go'
  2. ' '(空间)
  3. 'to'
  4. 'G'(上)
  5. 'l'(降低)
  6. 'a'(降低)
  7. 's'(降低)
  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'
;

导致:

在此处输入图像描述


如果您不完全确定两者之间的区别是什么,请参阅:ANTLR 中解析器规则和词法分析器规则之间的实际区别?

有关 s 的更多信息fragmentANTLR 中的“片段”是什么意思?


PS。格拉斯哥? _

于 2012-08-10T14:50:40.423 回答