- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用这个语法来计算数学表达式:
// Konfiguration (JavaCC-Manual konsultieren)
options {
STATIC = true; // alle Parser-operationen sind static
// verwende zwei Token um zu entscheiden, was passieren soll
LOOKAHEAD = 2;
}
// hier beginnt unsere Parser Klasse ("MathParse")
PARSER_BEGIN(MathParse)
// hier kann ganz normaler Java-Code verwendet werden
public class MathParse {
public static void main(String[] args) {
// auch ein statischer Parser muss initiiert werden
// - allerdings nur einmal
MathParse parser = new MathParse(System.in);
try {
System.out.println(parser.parse());
} catch(ParseException e) {
e.printStackTrace();
}
}
// die Parser-Methoden werden automatisch hinzugefügt
}
PARSER_END(MathParse)
// Diese Zeichen ignorieren wir
// SKIP : { $regex$ }
SKIP : { " " | "\t" }
// Jetzt definieren wir unsere Token
// TOKEN : { < $tokenname$ : $regex$ >}
// "NUMBER" entspricht einer unbegrenzten Anzahl (min. 1) an Zahlen
// (von 0 bis 9)
TOKEN : { < NUMBER : (["0"-"9"])+ ("." (["0"-"9"])+)? > }
TOKEN : { < EOL : "\n" > }
// Und fröhlich weiter mit der tatsächlichen Syntax
double parse() : {
double value;
}
{
value=expr()
(<EOF> | <EOL>) { return value; }
}
double expr() : {
double x;
double y;
}
{
x=term()
(
"+" y=expr() { x += y; }
|
"-" y=expr() { x -= y; }
)*
{ return x; }
}
double term() : {
double x;
double y;
}
{
x=value()
(
"*" y=term() { x *= y; }
|
"/" y=term() { x /= y; }
)*
{ return x; }
}
double value() : {
double value;
}
{
"-" value=number() { return -value; }
|
value=number() { return value; }
}
double number() : {
Token t;
double value;
}
{
t=<NUMBER> { return Double.parseDouble(t.image); }
|
"(" value=expr() ")" { return value; }
}
效果很好。但现在我不想得到一个数字作为结果,而是一个代表该术语的类结构。我想到了这样的事情:
public abstract class Expression {
public abstract double calculate();
}
public class NumberExpression extends Expression {
public double Value;
public NumberExpression(double value) {
this.Value = value;
}
public double calculate() {
return this.Value;
}
}
public class ComplexExpression extends Expression {
public Operator Operator;
public Vector SubExpressions;
public double calculate() {
double result = ((Expression)this.SubExpressions.elementAt(0)).calculate();
for (int i = 1; i < this.SubExpressions.size(); ++i)
result = this.Operator.calculate(result, ((Expression)this.SubExpressions.elementAt(i)).calculate());
return result;
}
}
public abstract class Operator {
public abstract String getOperator();
public abstract double calculate(double x, double y);
}
我对 Java 或 JavaCC 没有太多了解,所以你能告诉我如何为此编写语法吗?
PS:我使用的是 Java ME。
最佳答案
电子狼,
尝试使用 JJTree,它是 JavaCC 的预处理器,并自动引入为解析输入创建抽象语法树的 java 代码。
只需访问https://javacc.dev.java.net/并找到 JJTree 手册。
关于JavaCC - 将数学表达式解析为类结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/839362/
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我是第一次使用 JavaCC,我注意到它生成了大量死代码。有很多行看起来像(请原谅间距,它是自动的): {if ("" != null) return result;} throw new E
在 JavaCC 中,如何定义由重复字符组成的标记,如下例所示: "..." what would correspond to TOKEN : { TripleDot : "..." } 或 "::"
根据JavaCC documentation ,如果我想自定义词法分析器中错误给出的消息: To customize error reporting by the lexer, the lexer c
我正在尝试创建一个包含所有函数名称的映射。我可以在扫描阶段或解析阶段执行此操作,但似乎无法获得两者都可以访问的相同变量。 我需要的是在开始解析之前将所有函数名称保存在映射中,因为函数可以在其调用点下方
我有以下javacc语法。 规则UnaryExpr创建了一些实现java.util.function.Predicate<>的匿名类。 options { static=false; DEBUG_PA
如果可能,我的 void decleration() 应该根据图像解析字符串输入。 SKIP : { | | } TOKEN : { } TOKEN : { } TOKEN : /* KEYW
我目前正在为我的语法开发一个解析器。我的目标是在没有前瞻的情况下实现它,而这正是我真正正在努力解决的问题。 这是一个缩小的示例,我相信它足以证明我遇到的问题。 void main() : {} {
我使用这个语法来计算数学表达式: // Konfiguration (JavaCC-Manual konsultieren) options { STATIC = true; // a
我们正在使用 javacc 实现一个版本的乱码来构建我们的抽象语法树。我们有许多用 java 实现的类,由我们的 Parser.jj 程序调用。但是,Parser.jj 无法识别任何已实现的类,即使它
我正在尝试为这样的源代码创建一个解析器: [code table 1.0] code table code_table_name id = 500 desc = "my code ta
我的语法如下: PARSER_BEGIN(Parser) package parser; public class Parser {} PARSER_END(Parser) SKIP:
我正在尝试使用 javacc 创建一阶逻辑解析器,但遇到以下问题。 我有这个: ()* > 哪里 | | | ) > ,但我想从中排除一些词。特别是我想排除单词 sum、count、a
我需要使用 javaCC 来解析数据文件,例如: //This is comment to skip //This is also comment to skip //student Table Be
我是 JavaCC 的新手,无法弄清楚如何让它运行。我使用的是 Mac OS X,我安装了 javacc-6.0.zip 并解压了它。在键入 javacc 时,我无法从我的路径访问 javacc 脚本
我有一个语法,我必须使用 JJTree 和 JavaCC 来创建一个符号表和一个 AST。虽然我完全理解创建表和树的作业部分,但给我的语法含糊不清,包含左递归和间接左递归。它也需要留下因素。我在整个互
在我的语法中,有最初包含间接左递归的表达式和片段的产生规则。这是我删除了递归之后的规则。 String expression() #Expression : {String number; Token
匹配 任何内容 的正则表达式是什么,除了这些字符串: =>, | ? 如果您熟悉 javacc,我正在尝试定义我的 ANYTHING 标记,如下所示: TOKEN : { " > | | |
所以我是 JavaCC 的初学者,我只想在没有重复项的情况下接受这个字符串。因此,如果输入如下: A B C A' B' C' A'' B'' C'' 只有当`B != B' != B''时解析器才会
我已经为此困惑了好几天,搜索似乎没有给出任何结果。让我想知道这是否可能。例如: funct functionNAME (Object o) { o+1 }; 重点是用户必须在大括号内使用标识符“o”,
我是一名优秀的程序员,十分优秀!