![]() |
1
8
对于 the particular challenge you're solving ,使用语法就像用大锤敲螺母。 正如@Scimon所说,一个正则表达式就可以了。您可以通过适当的布局来保持它的可读性。您可以命名捕获并将它们全部保留在顶级:
(前缀
挖得少一点乱
你的
比赛 您不再需要依靠Perl 6猜测您的意思(当只有一个的时候,猜猜它猜你指的是哪一个。:)
如果你想放弃
现在你不必再提了
预挖上述技术仍然深入研究自动生成的解析树,默认情况下,解析树与语法规则调用层次结构中隐含的树完全对应。上面的技术只是让你挖掘它的方式看起来有点肤浅。
另一步是作为解析过程的一部分进行挖掘工作,以便
你
将一些代码直接内联到
现在你可以写:
这说明了您可以在任何规则的任意点编写任意代码——这在大多数解析形式及其相关工具中是不可能的——并且代码可以访问此时的解析状态。 内联代码既快又脏。使用变量也是如此。
存储数据的通常做法是使用
现在你可以写:
那要整洁得多。但还有更多。 .oO(在计划的第一天) Perl 6 Christmas Advent calendar 一个头衔对我说……)
在上面的示例中,我构建了一个
此稀疏子树由
这方面的规范用例是形成一个 Abstract Syntax Tree 在解析了一些编程代码之后。
让一切变得优雅对于可维护性和可重用性,您可以而且通常应该 不 在规则末尾插入内联代码,但应改为使用 Action objects
如上所述,添加括号,命名那些括号归零的捕获,如果这是挖掘解析树的一个很好的简化方法的话。
内联您希望在规则解析期间执行的任何操作。此时您可以完全访问解析状态。这非常便于从解析中提取所需的数据,因为您可以使用
|
![]() |
2
2
您可以直接引用每个命名部分。因此,要获得Cordinate,您可以访问:
这将返回
对于
|
![]() |
Håkon Hægland · 如何为语法的动作类添加默认方法? 7 年前 |
![]() |
Eddtothefullest · 解决这种转变/减少快乐/野牛的冲突 7 年前 |
![]() |
Zac Uwyo H · 生成语言L的BNF语法 7 年前 |
![]() |
user9193072 · 用泵引理证明语言的非正则性 7 年前 |
![]() |
JesseBuesking · 柠檬解析器减少错误 8 年前 |
![]() |
DainDwarf · 在antlr4中精确分析n个参数 9 年前 |
![]() |
Angel Todorov · 具有非贪婪规则的ANTLR 10 年前 |
![]() |
Zhao · 困惑于将模棱两可的语法转换为明确的语法 10 年前 |