优化以下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); } }
时间: 2023-06-28 10:10:52 浏览: 164
以下是修改后的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类型,作为计算的操作数。我们还添加了错误处理的代码,在输入了无法识别的字符时,程序会输出错误信息。
阅读全文