gpt4 book ai didi

JavaCC:如何保持原文(带空格)

转载 作者:行者123 更新时间:2023-11-30 04:24:07 25 4
gpt4 key购买 nike

假设我有一个简单的 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 = 62 + 1 = 3

不幸的是,因为我跳过了空格或换行符等字符,所以我得到的是:

5+2-1 = 62+1 = 3

有什么办法可以输出原始文本(包括跳过的字符)?

请注意,实际问题要大得多,语法也要复杂得多。所以我并不是真的在寻找特定于上述问题的解决方案(例如,预处理行并将它们拆分为换行符或修改方法以“手动”在每个标记后添加空格),而是更像是使用某些 JavaCC 功能的解决方案.

最佳答案

ANTLr 和 Xtext 都支持空白和注释的“隐藏标记”。请参阅here获取一些提示或使用 Google 来查找该术语。也许JavaCC有一些类似的概念。

编辑:JavaCC 似乎使用术语“特殊 token ”。请参阅here for some details .

关于JavaCC:如何保持原文(带空格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16316424/

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