[英]JavaCC: How can I maintain the original text (with spaces)
假设我有一个简单的JavaCC语法来解析加法和减法:
....
void CompilationUnit() :
{}
{
(Expression())+
EOF
}
void Expression() :
{}
{
Number()
(
Addition()
| Subtraction()
)*
}
void Number() :
{}
{
}
void Addition() :
{}
{
Number()
}
void Subtraction() :
{}
{
Number()
}
我有一些类使用此语法产生的AST来计算结果:
public class Calculator extends DepthFirstVisitor {
int result = -1;
public void visit(Expression n) {
if (result >= 0) System.out.println(toText(n) + " = " + result);
result = 0;
super.visit(n);
}
public void visit(Number n) {
...
}
public void visit(Addition n) {
...
}
....
}
我能够计算表达式的值,但我也需要原始表达式(如它所显示的)。 因此,对于以下输入:
5 + 2 - 1 2 + 1
我想要以下输出:
5 + 2 - 1 = 6 2 + 1 = 3
不幸的是,由于我跳过空格或换行符之类的字符,因此得到的是:
5+2-1 = 6 2+1 = 3
有什么办法可以输出原始文本(包括跳过的字符)?
请注意 ,实际问题要大得多,语法要复杂得多。 因此,我并不是真正在寻找针对上述问题的解决方案(例如,预处理行并将它们拆分为换行符,或者修改方法以在每个令牌后“手动”添加空格),而更像是使用某些JavaCC功能的解决方案。
基本上,您不能在编译器中执行此操作。 您将必须在语法中捕获空白作为令牌,并在允许的任何地方(无论在何处)都将其允许,结果语法太复杂,以致于无法实现甚至生成。 您将不得不捕获对实体源自的源代码(行和列)中的坐标的引用:例如,当前行和列号的文本。
编译器以其行为方式行事是有原因的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.