SableCC не использует методы интерпретатора
Я новичок в SableCC. Просто запустите пример калькулятора по адресу http://sablecc.sourceforge.net/thesis/thesis.html. Я использовал файл грамматики и файл интерпретатора, как они есть, и попытался разобрать простое арифметическое выражение, как "45 * 5 + 2". Проблема в том, что метод интерпретатора caseAMultFactor, похоже, не ударил. Я вижу, что он ударил caseAPlusExpr или caseAMinusExpr, если я изменил "+" на "-". Так что метод Start.apply(DepthFirstAdapter) проходит только через узел верхнего режима? Как я могу перебрать все узлы, как это делают примеры кода? Я использую Java 1.7 и надеюсь, что это не проблема.
Для вашего удобства я вставил сюда коды грамматики и интерпретатора. Спасибо за вашу помощь.
### Grammar:
Package postfix;
Tokens
number = ['0' .. '9']+;
plus = '+';
minus = '-';
mult = '*';
div = '/';
mod = '%';
l_par = '(';
r_par = ')';
blank = (' ' | 13 | 10)+;
Ignored Tokens
blank;
Productions
expr =
{factor} factor |
{plus} expr plus factor |
{minus} expr minus factor;
factor =
{term} term |
{mult} factor mult term |
{div} factor div term |
{mod} factor mod term;
term =
{number} number |
{expr} l_par expr r_par;
### Interpreter:
package postfix.interpret;
import postfix.analysis.DepthFirstAdapter;
import postfix.node.ADivFactor;
import postfix.node.AMinusExpr;
import postfix.node.AModFactor;
import postfix.node.AMultFactor;
import postfix.node.APlusExpr;
import postfix.node.TNumber;
public class Interpreter extends DepthFirstAdapter
{
public void caseTNumber(TNumber node)
{// When we see a number, we print it.
System.out.print(node);
}
public void caseAPlusExpr(APlusExpr node)
{
System.out.println(node);
}
public void caseAMinusExpr(AMinusExpr node)
{
System.out.println(node);
}
public void caseAMultFactor(AMultFactor node)
{// out of alternative {mult} in Factor, we print the mult.
System.out.print(node.getMult());
}
public void outAMultFactor(AMultFactor node)
{// out of alternative {mult} in Factor, we print the mult.
System.out.print(node.getMult());
}
public void outADivFactor(ADivFactor node)
{// out of alternative {div} in Factor, we print the div.
System.out.print(node.getDiv());
}
public void outAModFactor(AModFactor node)
{// out of alternative {mod} in Factor, we print the mod.
System.out.print(node.getMod());
}
}
1 ответ
То, что вы разместили, выглядит хорошо. Вы не опубликовали ничего из вывода и не опубликовали код для запуска интерпретатора.
Вот мой код (я опускаю код для Interpreter
так же как и у тебя)
package postfix;
import postfix.parser.*;
import postfix.lexer.*;
import postfix.node.*;
import java.io.*;
public class Compiler {
public static void main(String[] arguments) {
try {
Parser p = new Parser(new Lexer(new PushbackReader(
new StringReader("(45 + 36/2) * 3 + 5 * 2"), 1024)));
Start tree = p.parse();
tree.apply(new Interpreter());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
и когда запускается, он производит это:
45 36 2 / + 3 * 5 2 * +
Обратите внимание *
отображается, как и ожидалось.
ОБНОВЛЕНИЕ 2015-03-09
Сначала скопируйте / вставьте эту грамматику в файл с именем postfix.grammar. Он должен быть таким же, как у вас, но все равно просто скопировать / вставить:
Package postfix;
Tokens
number = ['0' .. '9']+;
plus = '+';
minus = '-';
mult = '*';
div = '/';
mod = '%';
l_par = '(';
r_par = ')';
blank = (' ' | 13 | 10)+;
Ignored Tokens
blank;
Productions
expr =
{factor} factor |
{plus} expr plus factor |
{minus} expr minus factor;
factor =
{term} term |
{mult} factor mult term |
{div} factor div term |
{mod} factor mod term;
term =
{number} number |
{expr} l_par expr r_par;
Затем запустите это из командной строки (конечно, внесите все необходимые изменения в каталог):
java -jar "C:\Program Files\Java\sablecc-3.2\lib\sablecc.jar" src\postfix.grammar
Убедитесь, что у вас есть только Java-классы из этого вызова SableCC (т.е. убедитесь, что все ранее сгенерированные Java-классы удалены). Затем, используя класс Compiler, который я ранее опубликовал, попробуйте снова. Я не могу вспомнить ни одной проблемы с грамматикой или проблемы с версией 3.2 SableCC, которая могла бы вызвать проблему у вас. Я надеюсь, что новый старт решит проблему.