SableCC 没有命中解释器方法
SableCC not hitting interpreter methods
我是 SableCC 的新手。只是 运行 http://sablecc.sourceforge.net/thesis/thesis.html#PAGE26 处的计算器示例。我原样使用了语法文件和解释器文件,并尝试解析像“45 * 5 + 2”这样的简单算术表达式。问题是,似乎没有命中解释器方法 caseAMultFactor。如果我将“+”更改为“-”,我会看到它命中 caseAPlusExpr 或 caseAMinusExpr。那么Start.apply(DepthFirstAdapter)方法是不是只走top模式节点呢?我怎样才能像示例代码那样遍历所有节点?我正在使用 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());
}
}
您 post 编辑的看起来不错。您没有 post 任何输出,您也没有 post 给 运行 解释器的代码。
这是我的代码(我省略了 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
首先,请copy/paste将此语法放入一个名为postfix.grammar的文件中。它应该与您拥有的相同,但无论如何只是 copy/paste:
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
请确保您只有来自此 SableCC 调用的 Java classes(即确保之前生成的任何 Java classes 被删除)。然后使用我之前 post 编辑的编译器 class,再试一次。我想不出任何语法问题或 SableCC 3.2 版的问题会导致您遇到的问题。我希望重新开始会解决问题。
我是 SableCC 的新手。只是 运行 http://sablecc.sourceforge.net/thesis/thesis.html#PAGE26 处的计算器示例。我原样使用了语法文件和解释器文件,并尝试解析像“45 * 5 + 2”这样的简单算术表达式。问题是,似乎没有命中解释器方法 caseAMultFactor。如果我将“+”更改为“-”,我会看到它命中 caseAPlusExpr 或 caseAMinusExpr。那么Start.apply(DepthFirstAdapter)方法是不是只走top模式节点呢?我怎样才能像示例代码那样遍历所有节点?我正在使用 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());
}
}
您 post 编辑的看起来不错。您没有 post 任何输出,您也没有 post 给 运行 解释器的代码。
这是我的代码(我省略了 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
首先,请copy/paste将此语法放入一个名为postfix.grammar的文件中。它应该与您拥有的相同,但无论如何只是 copy/paste:
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
请确保您只有来自此 SableCC 调用的 Java classes(即确保之前生成的任何 Java classes 被删除)。然后使用我之前 post 编辑的编译器 class,再试一次。我想不出任何语法问题或 SableCC 3.2 版的问题会导致您遇到的问题。我希望重新开始会解决问题。