type-6ren">
gpt4 book ai didi

java - 如何处理编译器中的字符串文字错误

转载 作者:行者123 更新时间:2023-12-02 05:21:59 24 4
gpt4 key购买 nike

我正在开发一个词法分析器,这是构建编译器的第一步。给定一个 .txt 文件,代码必须识别每个词汇组件,例如,如果我有

String c = "abcdefg";

必须打印

String -> type
c -> variable
= -> assignment operator
"abcdefg" -> constant String
; -> Delimit

但是如果我有这样的东西:

String c = "abc
d"; System.out.println("*");

编译会说:字符串文字没有正确地用双引号封闭。但是 java 编译器如何与另一个语句 System.out.println("*"); 一起工作?它是否必须忽略它,或者必须识别它的元素?

最佳答案

您问题的核心是:

But how does the java compiler has to work with the other statement, the System.out.println("*"); does it have to ignore it, or it has to identify its elements?

首先,尝试一下,看看 Java 编译器在这样的示例中实际给出了哪些错误消息。 (显然,您需要调整测试用例以隔离特定情况的处理......)

您很可能会发现编译器无法完美地进行恢复。我希望处理行尾未关闭的字符串的策略是假设字符串文字已关闭并继续以非引用模式“词法分析”。但在您的示例中,这可能会产生进一步的错误。

这引出了我的第二点。我建议你不要太努力地恢复词汇错误。重点关注让词法分析器/编译器在输入有效的情况下工作。当您让更重要的事情正常工作时,您随时可以在错误恢复方面进行改进。

(@EJP 的评论是正确的。“重型”错误恢复通常在解析器级别完成,而不是词法分析器级别。)

最后:您的要求:

String c = "abcdefg";

it has to print

String -> type
c -> variable
= -> assignment operator
"abcdefg" -> constant String
; -> Delimit

如果您正在解析真正的 Java,那么(纯)词法分析器无法做到这一点。问题是无法确定 String 是类型(或者应该是类型)而 a 是变量名(或者应该是变量名)在词法分析器中。事实上,如果您忽略语法上下文(词法分析器通常无法使用它!),那么 String 可能是各种各样的东西,包括类名、包名、方法名、字段名称、局部变量名称等。

处理这个问题的正常方法是词法分析器将 Stringa 视为“标识符”......并将其留给解析器和/或语义分析器来整理它。

关于java - 如何处理编译器中的字符串文字错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26445965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com