问题:
不知道如何翻译Antlr4“ .g4”语法文件的内容以匹配ParseKit的语法。

特别:
如何将-> Channel(HIDDEN);从Antlr4语法转换为ParseKit语法。

内容:
我在iOS的Objective-C / Xcode中创建一个.Framework。我需要生成一个模仿Java中Antlr4生成的解析器的基本功能的解析器。设计解析器功能的方法不成问题;我有兴趣了解有关Grammar Syntax for ParseKit的更多信息。

语法代码:

Antlr3
WHITESPACE : [ \t\r\n]+ {$channel=HIDDEN;}

Antlr4
WHITESPACE : [ \t\r\n]+ -> channel(HIDDEN);

ParseKit
whitespace = /[\s\t\r\n]+/ __________________;如何忽略???

问题:
-ParseKit是否支持频道?
-ParseKit用于发送到隐藏频道的语法是什么?
-另外,在本质上是否有与ParseKit中可用的Channel类似的功能?

最佳答案

ParseKit的创建者。 ParseKit没有Channels功能,也没有像ANTLR一样具有->树重写功能。 (通常,ParseKit的功能不如ANTLR)。

但是,您可以使用ParseKit的丢弃功能来达到所需的效果。

在设计ParseKit语法时,您的语言中通常会有纯语法的标记。这些标记对于计算结果或构建抽象语法树(用于进一步处理)都不重要。您通常需要使用ParseKit !指令自动丢弃这些令牌。

例如,假设您在ParseKit语法中有一个名为primaryExpr的规则,例如:

primaryExpr = atom
            | '(' expr ')'!
            ;


注意右括号!后的')'。这是一条丢弃指令,它指示ParseKit令牌生成器从报告给您的ParseKit汇编器(委托)回调的令牌流中丢弃)令牌。

因此,在您的-parser:didMatchPrimaryExpr:回调中,assembly参数的堆栈将不包含)标记。 )令牌将已经被丢弃。在这种情况下,丢弃是可取的,因为)是纯语法,对于处理相关的括号表达式而言并不重要。

因此,要舍弃语法中不重要的标记,请在其后立即放置!指令。

07-28 06:07