我正尝试在 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
谁能解释一下这背后的算法?它如何决定标记是否用空格分隔?
最佳答案
祝那个项目好运。在连最基本的算法都不知道的情况下,创建解析器生成器这一不平凡的任务变得更加雄心勃勃。您至少应该读一两本关于此事的书(经典是 Aho, Sethi + Ullmann 的 Dragon Book)。
但是回到你的问题。原则是:空格需要像任何其他输入一样处理,但通常你会在语法中找到一个 WS 或 Whitespace 词法分析器规则,它匹配各种类型的空格(空格,换行符,制表符等)并将它们放在一个隐藏 channel 。解析器只看到来自标准 channel 的标记,因此永远不会将空格作为标记。这是最常见的方法,因为空格的存在通常无关紧要(除了分隔两个需要被识别为 2 个不同标记的词汇条目)。
关于swift - ANTLR 中 WS 背后的魔力是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35968226/