希望我的标题不那么糟糕。我真的不知道这应该叫什么。我正在尝试用 Java 编写一个非常基本的方案解析器。我遇到的问题是实现。
我打开一个文件,我想解析各个标记:
while(sc.hasNext()) {
System.out.println(sc.next());
}
一般来说,为了获得代币,这样就可以了。但在scheme中,识别列表的开头和结尾至关重要;我的程序的功能取决于此,因此我需要一种处理 token 的方法,例如:
(define
或
poly))
作为多个标记,其中任何括号都是其自己的标记:
(
define
poly
)
)
如果我能做到这一点,我就可以正确识别要添加到我的符号表中的不同符号,并知道何时/如何将节点添加到我的解析树中。
Java API 显示扫描仪类没有任何方法可以完全执行我想要的操作。我能想到的最接近的事情是使用括号作为自定义分隔符,这将使每个标记足够干净,以便我的逻辑更容易识别,但是我的括号会发生什么?
我正在考虑的另一种方法是放弃 Java 分词器,而只是逐个字符地扫描,直到找到完整的符号。
我该怎么办?尝试解决 Java 扫描器方法,或者只是逐个字符地执行方法?
最佳答案
首先,您需要弄清术语。 (define
不是单个标记;它是一个 (
标记后跟一个 define
标记。同样,poly))
不是单个标记,而是三个标记。
不要让java.util.Scanner
(这就是您正在使用的,对吧?)让您陷入困境 - 当您说“通常,为了获取 token ,这很好”时,我说不,不是。如果它所提供的还不够,请不要满足于它。
要正确标记方案代码,我希望您至少需要能够处理常规语言。使用 Scanner
可能很难做到这一点,因此这里有几个替代方案:
- 学习并应用经过验证的解析工具,例如 Antlr 或 Lex。对您 future 的任何解析项目都有好处
- 采用您自己的正则表达式方法(我不太了解Scheme,无法确定这是否有效)进行标记化,但不要忘记您至少需要上下文无关才能进行完整解析
- 了解解析器组合器和递归下降解析,它们相对容易手动实现 - 最终您将学到大量有关 Java 类型系统的知识
关于Java,如何将 token 的一部分识别为单独的 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19605738/