加算と減算を解析するための単純な 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機能を使用している解決策に似ています.