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

标签 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

谁能解释一下这背后的算法?它如何决定标记是否用空格分隔?

最佳答案

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

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

关于swift - ANTLR 中 WS 背后的魔力是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35968226/

相关文章:

swift - 我可以为 CodingKey 设置两个字符串值吗?

antlr - "skip"更改解析器行为

java - 如何在 ANTLR 中处理左联想语法

java - 如何让antlr3解析 "forward?"

java - ANTLR4 JAVA - 是否可以在解析器监听器点从词法分析器中提取片段?

java - 有没有一个规范的例子说明如何使用 Antlr 4 来解析 SQL 语句?

ios - 更新Xcode到7.0后出现错误

iphone - 有没有办法阻止模态视图在 iPhone 上全屏显示

ios - UIViewController变量初始化

java - Antlr4的LABEL_CONFLICTS_WITH_RULE的含义