1

希望我的标题不是完全糟糕。我真的不知道这应该叫什么。我正在尝试用 Java 编写一个非常基本的方案解析器。我遇到的问题是实施。

我打开一个文件,我想解析单个令牌:

while(sc.hasNext()) {           
   System.out.println(sc.next());
}

通常,要获得令牌,这很好。但在计划中,识别列表的开始和结束是至关重要的;我的程序的功能取决于此,因此我需要一种处理令牌的方法,例如:

(define

或者

poly))

作为多个标记,其中任何括号都是它自己的标记:

(
define
poly
)
)

如果我能做到这一点,我可以正确识别要添加到我的符号表中的不同符号,并知道何时/如何将节点添加到我的解析树中。

Java API 显示扫描器类没有任何方法可以完全按照我的意愿进行操作。我能想到的最接近的事情是使用括号作为自定义分隔符,这将使每个标记足够干净,以便我的逻辑更容易识别,但是我的括号会发生什么?

我正在考虑的另一种方法是放弃 Java 标记器,而只是逐个字符地扫描,直到找到一个完整的符号。

我应该怎么办?尝试解决 Java 扫描器方法,或者只是逐个字符的方法?

4

1 回答 1

1

首先,你需要弄清楚你的术语。 (define不是一个单一的令牌;它是一个(令牌,后跟define一个。同样,poly))也不是一个令牌,而是三个。

不要让java.util.Scanner(这就是你正在使用的,对吗?)让你陷入循环——当你说“通常,为了获得令牌,这很好”,我说不,不是。如果它还不够,不要满足于它提供的东西。

要正确标记 Scheme 代码,我希望您至少需要能够处理常规语言。使用 可能很难做到Scanner,所以这里有几个选择:

  • 学习和应用一个久经考验的解析工具,如 Antlr 或 Lex。将有益于您未来的任何解析项目
  • 滚动你自己的正则表达式方法(我不太了解Scheme以确保这将起作用)用于标记化,但不要忘记你至少需要无上下文来进行完整解析
  • 学习解析器组合器和递归下降解析,它们相对容易手动实现——你最终会学到很多关于 Java 的类型系统的知识
于 2013-10-27T10:43:36.900 回答