【问题标题】:Java, how to recognize a part of a token as a separate token?Java,如何将令牌的一部分识别为单独的令牌?
【发布时间】:2013-10-26 10:44:32
【问题描述】:

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

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

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

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

(define

poly))

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

(
define
poly
)
)

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

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

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

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

【问题讨论】:

  • 不仅是空格和括号,还有各种引号。基于分隔符的扫描在那里不起作用。
  • @WillNess 这些链接如果不是那么先进会更有帮助。我正在研究的程序是编译器设计的必备课程,这甚至不是我大学的必修课程。我现在也明白我不能使用基于分隔符的方法,所以我认为基于字符的方法是我唯一的选择......
  • 看起来像;您总是可以为基本语法制作一些临时的东西(例如,不识别高级数字语法,例如(基数等))。或者甚至没有反引号。
  • @WillNess 这是我和我的搭档采取的方法。代码有点复杂,可能效率有点低,但它确实有效。除了识别保留字和一些语法之外,该分配不需要太多。现在我只需要写剩下的......

标签: java string parsing scheme


【解决方案1】:

首先,您需要明确您的术语。 (define 不是一个单一的令牌;这是一个( 令牌,后跟一个define 一个。同样,poly)) 不是一个令牌,而是三个。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 2018-10-29
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多