1

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


具体来说:
如何-> Channel(HIDDEN);从 Antlr4 语法翻译成 ParseKit 语法。


上下文:
我正在为 iOS 的 Objective-C/Xcode 创建一个 .Framework。我需要生成一个模仿 Java 中 Antlr4 生成解析器的基本功能的解析器。设计解析器功能的方法不是问题。我有兴趣了解有关ParseKit 语法语法的更多信息。


语法代码:

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

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

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


问题:
- ParseKit是否支持频道?
- ParseKit用来发送到隐藏频道 的语法是什么?
-或者,在 ParseKit 中是否有任何与 Channels 类似的性质?

4

1 回答 1

3

ParseKit的创建者在这里。ParseKit 没有Channels特性,也没有->ANTLR 那样的树重写特性。(一般来说,ParseKit 的功能不如 ANTLR)。

但是,您可能可以使用 ParseKit 的丢弃功能实现您正在寻找的效果。

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

例如,假设您的 ParseKit 语法中有一条规则,称为primaryExpr

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

注意!右括号后面的')'。这是丢弃指令,它指示 ParseKit 标记器)从报告给 ParseKit 汇编器(委托)回调的标记流中丢弃标记。

So in your -parser:didMatchPrimaryExpr: callback, the assembly parameter's stack will not contain the ) token. The ) token will have already been discarded. Discarding is desirable in this case, as the ) is pure syntax which is not important for processing the relevant parenthesized expression.

So to discard an unimportant token in your grammar, place a ! directive immediately after it.

于 2014-02-22T15:50:51.317 回答