2014-10-19 4814 views
0

我正在使用词法分析器,这是构建编译器的第一步。给定一个.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(“*”);是否必须忽视它,还是必须确定其要素?

+2

解析器参与错误恢复,其中包括丢弃令牌,直到重新建立可能的解析状态。 – EJP 2014-10-19 00:35:50

+0

...和弹出解析状态。 – EJP 2014-10-19 00:55:23

回答

2

你的问题的要点是:

但如何编译器具有Java来与其他说法,的System.out.println(“*”)工作;是否必须忽视它,还是必须确定其要素?

首先,试试看看Java编译器在这样的例子中实际给了你什么错误消息。 (显然,你需要调整你的测试用例来隔离处理该特定情况......)

你很可能会发现编译器不会做一个完美的恢复工作。我期望处理在行尾没有关闭的字符串的策略是假定字符串文字被关闭,并继续在非引用模式下“lexing”。但在你的例子中,这很可能会带来进一步的错误。

这使我想到了第二点。我建议你不要试图从词法错误中恢复。重点在于在输入有效的情况下让词法分析器/编译器工作。你可以随时回来改善错误恢复......当你有更重要的事情正常工作时。

(而@ EJP的评论是现货上的“重型”的错误恢复是在解析器水平通常进行,而不是词法分析器级别。)

最后:您的要求:

String c = "abcdefg"; 

它具有打印

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

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

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

相关问题