优化以下lex代码使之支持+,-,,/的运算,其中num为正整数 E -> E+E | E-E| EE | E/E | num,输出产生式并输出计算答案:%{ /**************************************************************************** mylexer.l ParserWizard generated Lex file. Date: 2023年4月17日 ****************************************************************************/ %} ///////////////////////////////////////////////////////////////////////////// // declarations section // lexical analyser name %name mylexer // class members { // place any extra class members here } // constructor { // place any extra initialisation code here } // place any declarations here chars [A-Za-z] numbers ([0-9])+ delim [" "\t] whitespace {delim}+ words {chars}+ newline [\n] equal [=] plus ["+"] multi ["*"] sub [-] div [/] %% ///////////////////////////////////////////////////////////////////////////// // rules section %{ // extract yylval for use later on in actions myparser.YYSTYPE yylval = (myparser.YYSTYPE)yyparserref.yylvalref; %} // place your Lex rules here {numbers} {yylval.strValue= new String(yytext,0,yyleng); yylval.value=Integer.parseInt(yylval.strValue); return myparser.NUMBER;} {newline} {yylval.strValue= new String(yytext,0,yyleng); return myparser.NEWLINE;} {plus} {yylval.strValue= new String(yytext,0,yyleng); return myparser.PLUS;} {multi} {yylval.strValue= new String(yytext,0,yyleng); return myparser.MULTI;} {sub} {yylval.strValue= new String(yytext,0,yyleng); return myparser.SUB;} {div} {yylval.strValue= new String(yytext,0,yyleng); return myparser.DIV;} %% ///////////////////////////////////////////////////////////////////////////// // programs section }
时间: 2023-06-28 13:10:52 浏览: 101
计算器(支持+,-,*,/)运算
以下是优化后的lex代码:
%{
/****************************************************************************
mylexer.l ParserWizard generated Lex file.
Date: 2023年4月17日
****************************************************************************/
%}
///////////////////////////////////////////////////////////////////////////////
// declarations section
// lexical analyser name
%name mylexer
// class members
{
// place any extra class members here
}
// constructor
{
// place any extra initialisation code here
}
// place any declarations here
chars [A-Za-z]
numbers ([0-9])+
delim [" "\t]
whitespace {delim}+
words {chars}+
newline [\n]
plus ["+"]
sub ["-"]
multi ["*"]
div ["/"]
%%
///////////////////////////////////////////////////////////////////////////////
// rules section
%{
// extract yylval for use later on in actions
myparser.YYSTYPE yylval = (myparser.YYSTYPE)yyparserref.yylvalref;
%}
// place your Lex rules here
{numbers} {
yylval.strValue = new String(yytext, 0, yyleng);
yylval.value = Integer.parseInt(yylval.strValue);
return myparser.NUMBER;
}
{newline} {
yylval.strValue = new String(yytext, 0, yyleng);
return myparser.NEWLINE;
}
{plus} {
yylval.strValue = new String(yytext, 0, yyleng);
return myparser.PLUS;
}
{sub} {
yylval.strValue = new String(yytext, 0, yyleng);
return myparser.SUB;
}
{multi} {
yylval.strValue = new String(yytext, 0, yyleng);
return myparser.MULTI;
}
{div} {
yylval.strValue = new String(yytext, 0, yyleng);
return myparser.DIV;
}
%%
///////////////////////////////////////////////////////////////////////////////
// programs section
// 输出产生式
%{
E : E PLUS E
| E SUB E
| E MULTI E
| E DIV E
| NUMBER
;
%}
// 输出计算答案
int main() {
yyparse();
return 0;
}
阅读全文