在ANTLR中WS背后的魔力是什么?

时间:2016-03-13 08:35:17

标签: swift antlr antlr4 lexer context-sensitive-grammar

我正试图在Swift中从头开始制作像ANTLR这样的工具(只是为了好玩)。但是我不明白语法怎么知道应该没有空格(标识符示例:“_ myIdentifier123”):

Identifier
 : Identifier_head Identifier_characters?

并且应该有空格(例如“是字符串”):

type_casting_operator
  : 'is' type
  | 'as' type
  | 'as' '?' type
  | 'as' '!' type
  ;

我在ANTLR的源代码中搜索过WS,但一无所获。 java代码中没有“WS”字符串:https://github.com/antlr/antlr4

任何人都可以解释这背后的算法吗?它是如何决定令牌是否用空格分隔的?

2 个答案:

答案 0 :(得分:3)

祝你好运。即使不了解最基本的算法,创建解析器生成器的这个非平凡任务也变得更加雄心勃勃。你至少应该读一两本关于此事的书(经典是龙书,来自Aho,Sethi + Ullmann)。

但回到你的问题。原则是:空格需要像任何其他输入一样处理,但通常你会在语法中找到一个WS或Whitespace lexer规则,它匹配各种类型的空格(空格,换行符,制表符等)并将它们放在一个隐藏的渠道。解析器只能从标准通道中看到令牌,因此永远不会将空格作为令牌。这是最常用的方法,因为空格的存在通常并不重要(除了将两个需要被识别为2个不同标记的词条分开)。

答案 1 :(得分:2)

第一条规则是词法分析器规则(注意大写第一个字母),而第二条规则是解析器规则。

白色空间标记通常不会传递给解析器(在这种情况下,必须有一个规则来跳过词法分析器中的空格),因此第二个规则看不到它。空格可以出现在其他令牌之间的任何位置。

相反,Lexer规则会查看输入中的所有字符,因此必须明确匹配任何空格。