⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expr_err.flex.svn-base

📁 实现的一个简单的语言编译器,可以编译类JAVA 的小语言
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
                                    // Do nothing.
                                 } else {
                                    boolean preSymbolNotExp = !(preSymbol == ExprESymbol.RPAREN
                                                                || preSymbol == ExprESymbol.INTEGER_LITERL
                                                                || preSymbol == ExprESymbol.IDENTIFIER);
                                    if (preSymbolNotExp) {
                                        addError(ExprError.NoOperandErr,
                                                 "Expect an integer literal, an identifier or"+
                                                 " a parenthesized expression as the left operand of +.",
                                                 yyline+1, yycolumn+1);
                                        yypushback(1);
                                        return symbol(ExprESymbol.NOP);
                                    }
                                 }
                                 
                                 return symbol(ExprESymbol.PLUS); 
                               }
                                
"-"                            { 
                                 if (preSymbol == ExprESymbol.NOP) {
                                    // Do nothing.
                                 } else {
                                    boolean preSymbolNotExp = !(preSymbol == ExprESymbol.RPAREN
                                                                || preSymbol == ExprESymbol.INTEGER_LITERL
                                                                || preSymbol == ExprESymbol.IDENTIFIER);
                                    if (preSymbolNotExp) {
                                        addError(ExprError.NoOperandErr,
                                                 "Expect an integer literal, an identifier or"+
                                                 " a parenthesized expression as the left operand of -.",
                                                 yyline+1, yycolumn+1);
                                        yypushback(1);
                                        return symbol(ExprESymbol.NOP);
                                    }
                                 }
                                 
                                 return symbol(ExprESymbol.MINUS); }

"*"                            {
                                 if (preSymbol == ExprESymbol.NOP) {
                                    // Do nothing.
                                 } else {
                                    boolean preSymbolNotExp = !(preSymbol == ExprESymbol.RPAREN
                                                                || preSymbol == ExprESymbol.INTEGER_LITERL
                                                                || preSymbol == ExprESymbol.IDENTIFIER);
                                    if (preSymbolNotExp) {
                                        addError(ExprError.NoOperandErr,
                                                 "Expect an integer literal, an identifier or"+
                                                 " a parenthesized expression as the left operand of *.",
                                                 yyline+1, yycolumn+1);
                                        yypushback(1);
                                        return symbol(ExprESymbol.NOP);
                                    }
                                 }
                                 
                                 return symbol(ExprESymbol.MULT); 
                               }

"/"                            {
                                 if (preSymbol == ExprESymbol.NOP) {
                                    // Do nothing.
                                 } else {
                                    boolean preSymbolNotExp = !(preSymbol == ExprESymbol.RPAREN
                                                                || preSymbol == ExprESymbol.INTEGER_LITERL
                                                                || preSymbol == ExprESymbol.IDENTIFIER);
                                    if (preSymbolNotExp) {
                                        addError(ExprError.NoOperandErr,
                                                 "Expect an integer literal, an identifier or"+
                                                 " a parenthesized expression as the left operand of /.",
                                                 yyline+1, yycolumn+1);
                                        yypushback(1);
                                        return symbol(ExprESymbol.NOP);
                                    }
                                 }
                                 
                                 return symbol(ExprESymbol.DIV); 
                               }

"="                            {
                                 if (preSymbol == ExprESymbol.NOP) {
                                    // Do nothing.
                                 } else {
                                    boolean preSymbolNotExp = !(preSymbol == ExprESymbol.RPAREN
                                                                || preSymbol == ExprESymbol.INTEGER_LITERL
                                                                || preSymbol == ExprESymbol.IDENTIFIER);
                                    if (preSymbolNotExp) {
                                        addError(ExprError.NoOperandErr,
                                                 "Expect an integer literal, an identifier or"+
                                                 " a parenthesized expression as the left operand of =.",
                                                 yyline+1, yycolumn+1);
                                        yypushback(1);
                                        return symbol(ExprESymbol.NOP);
                                    }
                                 }
                                 
                                 return symbol(ExprESymbol.EQ); 
                               }

/* numeric literals */

{IntegerLiteral}               { 
                                 /* The first three if-else statements detect whether there are integer literals
                                  * before which are identifiers, integer literals or )'s. If so, return a NOP 
                                  * and push integer literal back into the input stream.
                                  */
                                 if (preSymbol == ExprESymbol.IDENTIFIER) {
                                    addError(ExprError.AdjExpErr, 
                                             "Expect an operator between identifier and integer.",
                                             yyline+1, yycolumn+1);
                                    yypushback(yytext().length());
                                    return symbol(ExprESymbol.NOP);
                                 } else if (preSymbol == ExprESymbol.INTEGER_LITERAL) {
                                    addError(ExprError.AdjExpErr, 
                                             "Expect an operator between integers.",
                                             yyline+1, yycolumn+1);
                                    yypushback(yytext().length());
                                    return symbol(ExprESymbol.NOP);
                                 } else if (preSymbol == ExprESymbol.RPAREN) {
                                    addError(ExprError.AdjExpErr, 
                                             "Expect an operator between integer and parenthesized expression.",
                                             yyline+1, yycolumn+1);
                                    yypushback(yytext().length());
                                    return symbol(ExprESymbol.NOP);
                                 }
                                  
                                 return symbol(ExprESymbol.INTEGER_LITERAL, new Integer(yytext())); 
                               }

/* comments */
{Comment}                      { /* ignore */ }

/* whitespace */
{WhiteSpace}                   { /* ignore */ }

/* identifiers */ 
{Identifier}                   { 
                                 /*
                                  * The first if-else statements detect whether there are identifiers before which
                                  * are identifiers, integer literals or )'s. If so, return a NOP and push the
                                  * identifier back into the input stream.
                                  */
                                 if (preSymbol == ExprESymbol.IDENTIFIER) {
                                    addError(ExprError.AdjExpErr,
                                             "Expect an operator or a semicolon between identifiers.",
                                             yyline+1, yycolumn+1);
                                    yypushback(yytext().length());
                                    return symbol(ExprESymbol.NOP);                                    
                                 } else if (preSymbol == ExprESymbol.INTEGER_LITERAL) {
                                    addError(ExprError.AdjExpErr,
                                             "Expect an operator or a semicolon between integer and identifier.",
                                             yyline+1, yycolumn+1);
                                    yypushback(yytext().length());
                                    return symbol(ExprESymbol.NOP);                                    
                                 } else if (preSymbol == ExprESymbol.RPAREN) {
                                    addError(ExprError.AdjExpErr,
                                             "Expect an operator or a semicolon between parenthesized expression and identifier.",
                                             yyline+1, yycolumn+1);
                                    yypushback(yytext().length());
                                    return symbol(ExprESymbol.NOP);                                    
                                 } 
                                 
                                 return symbol(ExprESymbol.IDENTIFIER, yytext()); 
                               }  

}

/* error fallback */
.|\n                           { throw new RuntimeException("Illegal character \""+yytext()+
                                                            "\" at line "+yyline+", column "+yycolumn); }

<<EOF>>                        { return symbol(ExprESymbol.EOF); }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -