0

SableCC は初めてです。http://sablecc.sourceforge.net/thesis/thesis.html#PAGE26で電卓の例を実行しました。文法ファイルとインタプリタファイルをそのまま使い、「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());
     }
}
4

1 に答える 1