Java,如何将令牌的一部分识别为单独的令牌?

时间:2013-10-26 10:44:32

标签: java string parsing scheme

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

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

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

一般来说,要获得令牌,这很好。但在计划中,认识到清单的开头和结尾是至关重要的;我的程序的功能取决于此,所以我需要一种方法来处理令牌,如:

(define

poly))

作为多个令牌,其中任何括号都是其自己的令牌:

(
define
poly
)
)

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

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

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

我该怎么办?尝试解决Java扫描程序方法,或者只是逐字符处理?

1 个答案:

答案 0 :(得分:1)

首先,您需要直截了当地学习术语。 (define不是一个令牌;它是(令牌,后跟define令牌。同样,poly))不是单个令牌,而是三个。

不要让java.util.Scanner(这就是你正在使用的,对吧?)扔你一个循环 - 当你说“一般来说,得到令牌,这很好”,我说不,这是不。如果还不够,不要满足于提供的东西。

为了正确地标记Scheme代码,我希望你至少能够处理常规语言。使用Scanner可能非常困难,所以这里有几个选择:

  • 学习并应用像Antlr或Lex这样经过验证的解析工具。将有益于您未来的任何解析项目
  • 滚动你自己的正则表达式方法(我不太了解Scheme以确保它可以正常工作)进行标记化,但不要忘记你至少需要无上下文才能完全解析
  • 了解解析器组合器和递归下降解析,它们相对容易实现 - 你最终会学习Java类型系统