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

标签 java string parsing scheme

希望我的标题不那么糟糕。我真的不知道这应该叫什么。我正在尝试用 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/

相关文章:

java - 如何避免对资源的并发访问?

java - 使用类似于 Spring 的 Guice 将属性注入(inject)到像 VelocityEngineFactoryBean 这样的类中

java - 在 cloudbees 上运行基本 servlet 时出现 404 错误

java - 从 Wavemaker 中的 Eclipse 导入的 .jar 文件中调用我的 testImage() 方法时出错

java - 在格式化特定日期/时间格式时遇到问题

java - 解析巨大的XML文件形成DOM树

c - Linux,field_buffer不提供UTF-8字符串

java - 用不同的值替换长字符串的一部分

c++ - 如何在解析过程中区分 IP 地址和域名

android - 在 Android 中解析 Google Books JSON