2013-05-01 1 views
1

Давайте предположим, что у меня есть простая грамматика 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 ,

ответ

2

Оба ANTLr и Xtext поддерживают «скрытые маркеры» для пробелов и комментариев. См. here для некоторых советов или используйте Google с этим термином. Возможно, у JavaCC есть аналогичная концепция.

EDIT: JavaCC, кажется, использует термин «специальный токен». См. here for some details.

+0

Да JavaCC имеет специальные токены. См. Q 5.2 в FAQ на http://www.engr.mun.ca/~theo/JavaCC-FAQ/. –

0

В принципе, вы не можете сделать это в компиляторе. Вам нужно было бы записать пробел в качестве символа в грамматике и разрешить его везде, где это разрешено, что есть повсюду, и результирующая грамматика будет настолько сложной, что ее невозможно реализовать или даже генерировать. Вам нужно будет сделать привязку к координатам в исходном коде (строка и столбец), откуда пришел объект: может быть, например, текст текущей строки и номера столбца.

Существует причина, по которой компиляторы ведут себя так, как они делают.

+0

Это JavaCC (и многие другие генераторы синтаксического анализатора) делает это легко, без дополнительной сложности подрывает ваш ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^