// place your YACC rules here (there must be at least one) express :dexpress NEWLINE { System.out.println("Answer:"+$1.value); }; dexpress :dexpress RBRAKET {System.out.print("RBRAKET express"); $$.strValue="("+$2.strValue; $$.value=$2.value; System.out.println($$.value); }; dexpress :dexpress LBRAKET { System.out.print("LBRAKET express"); $$.strValue=$2.strValue+")"; $$.value=$2.value; System.out.println($$.value); }; dexpress :dexpress PLUS dexpress { System.out.print("Plus express"); $$.value = $1.value +$3.value; System.out.println($$.value); }; dexpress: dexpress SUB dexpress {System.out.print("Sub express"); $$.value = $1.value -$3.value; System.out.println($$.value);}; dexpress: dexpress DIV dexpress {System.out.print("Div express"); $$.value = $1.value /$3.value; System.out.println($$.value);}; dexpress: dexpress MULTI dexpress {System.out.print("Multi express"); $$.value = $1.value *$3.value; System.out.println($$.value);}; dexpress :NUMBER { $$.value=$1.value; System.out.println("Number to dexpress "+$1.value); }; dexpress :EQUAL { System.out.print("Equal express"); $1.value = $3.value; $$.value = $1.value; System.out.println($$.value); };帮我修改错误
时间: 2023-12-03 16:46:17 浏览: 39
在你的 YACC 规则中,有一个错误:在 `dexpress` 规则的最后一行,你使用了 `$1` 和 `$3`,但是在此之前没有定义 `$1` 和 `$3`,因此会导致语法分析错误。
你需要将该规则修改为以下内容:
```
dexpress : dexpress EQUAL dexpress {
System.out.print("Equal express");
$1.value = $3.value;
$$.value = $1.value;
System.out.println($$.value);
}
```
这里使用了 `$1` 和 `$3` 来引用等号两侧的表达式的值,因此你需要确保你之前定义了这两个规则。
相关问题
place your YACC rules here (there must be at least one):E -> E+E | E-E| E*E | E/E | (E) | num;
This is an example of a YACC rule for a basic arithmetic expression language. Here, E stands for an arithmetic expression, which can be a combination of addition, subtraction, multiplication, division, parentheses, or a single number.
The YACC rule is as follows:
```
E -> E + E
| E - E
| E * E
| E / E
| (E)
| num
```
This rule specifies that an arithmetic expression can be formed by adding two expressions together, subtracting one expression from another, multiplying two expressions, dividing one expression by another, enclosing an expression in parentheses, or simply consisting of a single number.
优化以下lex代码使之支持+,-,,/的运算,其中num为正整数 E -> E+E | E-E| EE | E/E | num,输出产生式并输出计算答案:%{ /**************************************************************************** myparser.y ParserWizard generated YACC file. Date: 2023年4月17日 ****************************************************************************/ %} ///////////////////////////////////////////////////////////////////////////// // declarations section // parser name %name myparser // class members { // place any extra class members here } // constructor { // place any extra initialisation code here } // attribute type %union { public int value; public String strValue; public void yycopy(yyattribute source, boolean move) { YYSTYPE yy = (YYSTYPE)source; value = yy.value; strValue=yy.strValue; } } // place any declarations here %token NUMBER %token NEWLINE %left PLUS SUB %left MULTI DIV %start express %% ///////////////////////////////////////////////////////////////////////////// // rules section // place your YACC rules here (there must be at least one) express :dexpress NEWLINE { System.out.println("Answer:" + $1.value); }; dexpress :dexpress PLUS dexpress { System.out.print("Plus express "); $$.value=$1.value+$3.value; System.out.println($$.value); }; dexpress :NUMBER { $$.value=$1.value; System.out.println("Number to dexpress "+$1.value); }; %% ///////////////////////////////////////////////////////////////////////////// // programs section public static void main(String args[]) { int n = 1; mylexer lexer = new mylexer(); myparser parser = new myparser(); if (parser.yycreate(lexer)) { if (lexer.yycreate(parser)) { n = parser.yyparse(); } } System.exit(n); } }
以下是修改后的lex代码,支持+、-、*、/的运算:
%{
/****************************************************************************
myparser.y ParserWizard generated YACC file. Date: 2023年4月17日
****************************************************************************/
%}
%option noyywrap
%{
// Place any Java code here that you need
%}
%union {
public int value;
public String strValue;
}
%token NUMBER
%token PLUS SUB
%token MULTI DIV
%token NEWLINE
%%
// Rules section
express : dexpress NEWLINE {
System.out.println("Answer: " + $1.value);
};
dexpress : dexpress PLUS dterm {
$$.value = $1.value + $3.value;
};
dexpress : dexpress SUB dterm {
$$.value = $1.value - $3.value;
};
dexpress : dterm {
$$.value = $1.value;
};
dterm : dterm MULTI dfactor {
$$.value = $1.value * $3.value;
};
dterm : dterm DIV dfactor {
$$.value = $1.value / $3.value;
};
dterm : dfactor {
$$.value = $1.value;
};
dfactor : NUMBER {
$$.value = Integer.parseInt($1.strValue);
};
// Ignore whitespace and tabs
[ \t]+
// Ignore newlines
[\r\n]+
// Error handling
. {
System.out.println("Error: Invalid character " + yytext());
}
%%
// Programs section
public static void main(String args[]) {
int n = 1;
mylexer lexer = new mylexer();
myparser parser = new myparser();
if (parser.yycreate(lexer)) {
if (lexer.yycreate(parser)) {
n = parser.yyparse();
}
}
System.exit(n);
}
在上述代码中,我们增加了dterm和dfactor两个非终结符,支持*和/的运算。同时,我们修改了dexpress的产生式,使其支持+、-的运算。在dfactor中,我们将读入的字符串$1.strValue转换成int类型,作为计算的操作数。我们还添加了错误处理的代码,在输入了无法识别的字符时,程序会输出错误信息。