2015-02-11 2 views
0

Я новичок в SableCC. Просто запустил пример калькулятора в http://sablecc.sourceforge.net/thesis/thesis.html#PAGE26. Я использовал файл грамматики и файл интерпретатора, как они есть, и попытался разобрать простое арифметическое выражение типа «45 * 5 + 2». Проблема заключается в том, что метод интерпретатора caseMultFactor, похоже, не попал. Я вижу, что он удаляет caseAPlusExpr или caseAMinusExpr, если я меняю «+» на «-». Также метод Start.apply (DepthFirstAdapter) проходит через узел верхнего режима? Как я могу выполнять итерацию по всем узлам, как это делают коды образцов? Я использую Java 1.7 и надеюсь, что это не проблема.SableCC не использует методы интерпретатора

Для вашего удобства здесь были вставлены коды грамматики и интерпретатора. Спасибо за вашу помощь.

### 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()); 
    } 
} 

ответ

0

Что вы размещаете, выглядит хорошо. Вы не опубликовали ни одного из результатов, и вы не отправили код для запуска интерпретатора.

Вот мой код (я опускаю код 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 * +

Примечание к * отображается, как и ожидалось.

UPDATE 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 были удалены). Затем, используя класс компилятора, который я ранее разместил, повторите попытку. Я не могу придумать никаких проблем с грамматикой или проблемой с версией 3.2 SableCC, которая вызовет проблему, с которой вы столкнулись. Я надеюсь, что новое начало решит проблему.

+0

Спасибо за ваш ответ. Извините, не видел этого раньше, потому что никто не ответил на него через несколько дней после моего размещения. – user2045610

+0

Когда я пробовал ваши коды, он выводит: [1,1] Неизвестный токен: ( – user2045610

+0

Смотрите мой UPDATE 2015-03-09. – mbmast

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

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