gpt4 book ai didi

编程语言解析器的 Java 字符串标记化

转载 作者:行者123 更新时间:2023-12-01 22:46:02 38 4
gpt4 key购买 nike

几个月前,我认为制作自己的编程语言会很酷。所以我做了。我把它命名为Pogo 。如果你查看代码,你会看到大量 String#split 。下面是一些伪代码,描述了如何解析方法 header :

给定method public void main() ,我看看是否String#startsWith("method") 。如果是这样,我String#split(" ")并将第二个词(公共(public))解析为可见性。我将第三个单词(void)视为返回类型,并检查它是否是基元或类。最后,我将最后一个单词视为名称并正确解析所有方法参数。

这个方法可行,但我知道这是错误的。您应该将所有内容标记化并像这样处理它。但是,我不太明白这是如何运作的。我知道我会使用 Java 的 StringTokenizer ,但是我将如何解析方法头?鉴于method public void main() ,第一个标记是方法。我知道我正在使用一种方法,但我无法实例化我的 Method类,因为我还没有所有信息。看来我必须为 StringTokenizer 声明一个循环并且外面有大量的变量,这看起来比我现在所拥有的还要糟糕。

tl;dr:我应该如何使用字符串标记化来解析自定义编程语言。我并不是真的在寻找代码,更像是伪代码或想法。

谢谢!

最佳答案

看起来这并不是一个真正的标记化问题。在相当标准的解析器中,有不同的阶段,标记化 - 将输入分解为 block (“method”,“”public”,“void”,“main”,“(”,“)”)和解析 - 获取列表标记并根据语言的语法将它们组合起来。将这两个分开是有意义的,不要尝试在标记阶段进行任何语法分析。

编程语言非常复杂,解析是一项专门的任务,有特殊的工具可以完成这样的任务。在 unix/C 世界中,有用于标记化的 lex/flex 和用于解析的 yacc/bison。在java中,有我用过的JavaCC,可能还有很多其他的。您会发现使用这些通常为解析器生成代码的工具要容易得多。这在语法灵活的早期阶段尤其有值(value)。更改语法定义文件来尝试和调试一些复杂的手写代码会容易得多。

有时,在最后阶段,编译器会转向为解析器手写代码,但这些是复杂的状态机,需要大量理论才能正确。

关于编程语言解析器的 Java 字符串标记化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25346555/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com