问题:
不知道如何翻译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
参数的堆栈将不包含)
标记。 )
令牌将已经被丢弃。在这种情况下,丢弃是可取的,因为)
是纯语法,对于处理相关的括号表达式而言并不重要。因此,要舍弃语法中不重要的标记,请在其后立即放置
!
指令。