【发布时间】:2016-04-07 18:13:19
【问题描述】:
我目前正在用 Java 创建一个简单的 Lexer 生成器。我差不多完成了,在这里和那里解决了一些错误,但遇到了一个问题。
我希望能够在 Lexer 中包含评论检测,并希望以特定方式包含 cmets:
- 注释由任何字符集分隔,存储在字符串中。
- 示例:
single = "//"、multi_beg = "/*"和multi_end = "*/"
- 示例:
- 注释字符之间和包括注释字符之间的任何内容都需要替换为空格,因为 Lexer 使用空格来检测标记之间的间隙。 (用 void 替换可能会导致两个令牌融合在一起)
包含这样的东西在技术上很容易,只需几个布尔值和字符串替换。但是,Lexer 还包含可定义的字符串和字符常量。由于可以在这些常量中定义注释字符,因此当当前未定义字符串或字符时,cmets 只能是“可执行的”。
这方面的逻辑可能如下所示:
- 如果当前已封装,则不执行任何操作,直到找到未封装字符。
- 如果未封装,并且找到封装字符,则封装。
- 如果未封装,并且找到 单行 行注释,请将所有 之后的内容(包括注释字符)替换为空格。 (我们处理的是单个字符串,而不是数组,因此 之后的所有内容仅引用一行)
- 如果没有封装,并且开始了 多行 行注释,请将所有 之后的内容(包括注释字符)替换为空格,直到多行注释为 结束。
我的脑海里已经完全记下了这个想法,但不知道如何在 Java 中实现它。
注意:我正在处理一个字符串数组,并且正在考虑通过增强的 for 循环来实现这一点,在 Scanner 中一次处理每一行,在标记堆栈之前处理 cmets。
for (String s : data) {
// ???
}
关于如何用 Java 实现这一点有什么想法吗?
更新:这是我希望我的输入/输出的样子:
【问题讨论】:
-
您要对输入数组执行操作吗?通常词法分析器将输入拆分为标记,一个新的结构,而不修改输入。为什么下一个标记不能只是一个完整的字符串文字?
-
@Basilevs 我已将词法分析器调整为多个部分。首先是 Scanner,其次是 Tokenizer。在将数据显示到 Tokeniser 之前,我想简单地从字符串中完全“擦除” cmets,几乎就像完成了白化一样。
-
@Basilevs 这将是迄今为止执行的唯一操作。
-
现在你有两个标记器没有明显的好处,不是吗?
-
@Basilevs 不。我想从字符串数组中的字符串中删除数据。一旦字符串数组中所有可能出现的位置都被删除,发送该数组以进行tokenised。
标签: java string logic character