0

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

Identifier
 : Identifier_head Identifier_characters?

并且应该有空格(例如“is String”):

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

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

谁能解释这背后的算法?它如何决定令牌是否用空格分隔?

4

2 回答 2

3

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

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

于 2016-03-13T10:12:46.903 回答
2

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

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

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

于 2016-03-13T08:51:41.987 回答