首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SableCC不命中解释器方法

SableCC不命中解释器方法
EN

Stack Overflow用户
提问于 2015-02-11 03:50:18
回答 1查看 477关注 0票数 0

我是SableCC的新手。刚刚在http://sablecc.sourceforge.net/thesis/thesis.html#PAGE26上运行了计算器示例。我使用语法文件和解释器文件,并试图解析简单的算术表达式,如"45 *5+ 2“。问题是,解释器方法caseAMultFactor似乎没有被击中。如果我将"+“改为"-”,就会看到它击中了caseAPlusExpr,或者caseAMinusExpr。那么,Start.apply(DepthFirstAdapter)方法是否只通过顶层模式节点?我如何遍历所有节点,就像示例代码所做的那样?我正在使用Java1.7,希望这不是一个问题。

为了您的方便,我在这里粘贴了语法和翻译代码。谢谢你的帮助。

代码语言:javascript
复制
### 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());
     }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-19 22:42:43

你贴的东西看起来很好。您没有发布任何输出,也没有发布运行解释器的代码。

下面是我的代码(我省略了Interpreter的代码,因为它与您的代码相同):

代码语言:javascript
复制
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的文件中。它应该和你所拥有的一样,但无论如何,只需复制/粘贴:

代码语言:javascript
复制
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;

接下来,从命令行运行此命令行(当然,进行任何必要的目录更改):

代码语言:javascript
复制
java -jar "C:\Program Files\Java\sablecc-3.2\lib\sablecc.jar" src\postfix.grammar

请确保您只有SableCC调用中的Java类(即确保删除了以前生成的任何Java类)。然后使用我之前发布的Compiler类,再试一次。我想不出SableCC的语法或版本3.2有什么问题会导致您遇到的问题。我希望新的开始能解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28446308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档