【问题标题】:New lines in Java source files: How to test for them using Character class?Java 源文件中的新行:如何使用 Character 类对其进行测试?
【发布时间】:2012-02-04 17:04:48
【问题描述】:

用 Java 编写 .java 源文件的词法分析器。我有一个字符流,我试图让词法分析器跳过单行 cmets。

我遍历每个字符,我的假设是应该可以首先检测注释的 //,然后跳过后续字符,直到下一个换行符。但它不起作用,我无法检测到任何换行符。这是我的代码:

//is it a single line comment?
if(currentChar == '/') {

    //loop through char:s until next new line
    while(inComment == true) {
        //increment loop
        i++;

        //extract next char
        currentChar = stringInput.charAt(i);

        //check if current character is a new line
        if(( currentChar == '\n' ) || ( currentChar == '\r' )) {
            inComment = false;
            System.out.println("End Of Line Comment.");                             
        }
    }
}

那么,.java 源文件有换行符吗?是否可以使用 Character 类或任何其他方式检测它们?

非常感谢!

解决方案:

在使用 BufferedReader 从 .java 源文件中读取代码并将行附加到 StringBuilder 时,新行字符似乎丢失了。问题是通过使用 org.apache.commons.io.FileUtils 中的 readFileToString() 读取 .java 文件来解决的,这很有效!

【问题讨论】:

  • 你在哪里设置 inComment 为 true ?它应该在 if(currentChar == '/') 部分之后。
  • 我更早地检查了 /。然后我再次检查另一个 / 或 * 以区分块和单行 cmets。但你是对的,谢谢。

标签: java parsing line new-operator lexer


【解决方案1】:

你如何阅读stringInput?如果您使用的是readLine,为什么不按照这个伪代码:

if (stringInput starts with "//")
    readNextLine()

更短更容易理解。 提示:通读 String API。

【讨论】:

  • 好建议。但是,stringInput 是一个 StringBuilder 对象,我正在使用 charAt() 循环它来查看每个字符。
  • StringInput 是如何创建的?您是逐行阅读并附加吗?
【解决方案2】:

应该可以,比较 currentChar == '\n' 应该可以正常工作,并在您到达行尾时返回 true。

您确定在读取文件时您的换行符不会丢失,例如通过使用 BufferedReader.readLine()?如果是这种情况,请尝试另一种方式将文件读入字符串,例如使用 jakarta commons-io 中的 FileUtils.readFileToString。

【讨论】:

    【解决方案3】:

    在 if 条件和 while 循环之间,您是否将 inComment 值设置为 true ?您还必须检查两个斜线。

    【讨论】:

    • 你是对的,谢谢。我先检查 / 再检查 / 或 * 以检测块和单行 cmets。
    猜你喜欢
    • 2012-12-09
    • 2016-09-20
    • 1970-01-01
    • 2023-01-26
    • 2020-06-19
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多