Давайте предположим, что у меня есть простая грамматика JavaCC для синтаксического анализа сложения и вычитания: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 ,
Да JavaCC имеет специальные токены. См. Q 5.2 в FAQ на http://www.engr.mun.ca/~theo/JavaCC-FAQ/. –