int main( ) { execute( Seq( If( True( ), Print( String( "hello " ) ), Print( True( ) ) ), If( Or( False( ), Neg( True( ) ) ), Print( Unit( ) ), Print( String( "world!\n" ) ) ) ) ); execute( Seq( When( True( ), Print( String( "hello " ) ) ), Unless( False( ), Print( String( "world!\n" ) ) ) ) ); execute( Print( Print( Seq( Print( True( ) ), Print( False( ) ) ) ) ) ); execute( Print( Concat( String( "4" ), Show( True( ) ) ) ) ); assert( value_to_bool( execute( IsDefined( String( "not defined" ) ) ) ) == false ); execute( Seq( Set( String( "SomeVar" ), String( "12" ) ), Seq( Print( Get( String( "SomeVar" ) ) ), Seq( Set( Concat( String( "S" ), String( "omeVar" ) ), String( "345\n" ) ), Print( Get( Concat( String( "Some" ), String( "Var" ) ) ) ) ) ) ) ); execute( Seq( If( True( ), Set( String( "hello " ), String( "hellos \n" ) ), Print( True( ) ) ), Print( Get( String( "hello " ) ) ) ) ); execute( Seq( Scope( Set( String( "hi" ), True( ) ) ), Print( IsDefined( String( "hi" ) ) ) ) ); assert( value_to_bool( execute( Seq( Seq( Set( String( "var" ), False( ) ), Scope( Set( String( "var" ), True( ) ) ) ), Get( String( "var" ) ) ) ) ) ); execute( Seq( Seq( Set( String( "b1" ), True( ) ), Set( String( "b2" ), True( ) ) ), While( Or( Get( String( "b1" ) ), Get( String( "b2" ) ) ), If( Get( String( "b1" ) ), Seq( Set( String( "b1" ), False( ) ), Print( String( "Hello" ) ) ), Seq( Set( String( "b2" ), False( ) ), Print( String( "World" ) ) ) ) ) ) ); }
void tri(Ptr<Int> p) { p = p + (me() << 4); Int n = *p; Int sum = 0; While (any(n > 0)) Where (n > 0) sum = sum+n; n = n-1; End End *p = sum; }
/* <Statement> ::= <Compound> | <Assign> | <If> | <Return> | <Write> | <Read> | <While> */ bool SyntaxAnalyzer::Statement() { if(Compound()) { logger.Log("<Statement> ::= <Compund>"); return true; } else if(Assign()) { logger.Log("<Statement> ::= <Assign>"); return true; } else if(If()) { logger.Log("<Statement> ::= <If>"); return true; } else if(Return()) { logger.Log("<Statement> ::= <Return>"); return true; } else if(Write()) { logger.Log("<Statement> ::= <Write>"); return true; } else if(Read()) { logger.Log("<Statement> ::= <Read>"); return true; } else if(While()) { logger.Log("<Statement> ::= <While>"); return true; } else { return false; } }
bool Parser::Stmt() { if ("identifier" == tok) { if (!Assign()) return false; else { std::cout << "Stmt => Assign\n"; return true; } } else if ("read" == lex) { if (!Read()) return false; else { std::cout << "Stmt => Read\n"; return true; } } else if ("write" == lex) { if (!Write()) return false; else { std::cout << "Stmt => Write\n"; return true; } } else if ("if" == lex) { if (!If()) return false; else { std::cout << "Stmt => If\n"; return true; } } else if ("while" == lex) { if (!While()) return false; else { std::cout << "Stmt => While\n"; return true; } } else { std::cout << "Error with statement\n"; return false; } }
// 函数块 void CodeGenerator::Block() { while(!isNext("}")) { CodeToken T = getToken(); string value = T.value; if(value == "if") { If(); } else if(value == "while") { While(); } else if(value == "for") { For(); } else if(value == "read") { match("("); addQuad("read", getToken().value, "$", "$"); match(")"); match(";"); } else if(value == "write") { match("("); addQuad("write", getToken().value, "$", "$"); match(")"); match(";"); } else if(value == "return") { addQuad("return", itos(getToken().num), "$", "$"); match(";"); } else if(CodeToString(T) == "id") { CurToken--; Assign(); } else { puts("函数块错误!!"); printf("in %d", CurLine()); exit(0); } } }
bool syntaxparser::Statement(){ bool bStatement = false; if (lexeme == "{"){ bStatement = true; if(displayFlag){ cout << "<Statement> ::= <Compound>" << endl; printproduction("<Statement> ::= <Compound>"); } Compound(); } else if (token == "identifier"){ bStatement = true; if(displayFlag){ cout << "<Statement> ::= <Assign>" << endl; printproduction("<Statement> ::= <Assign>"); } Assign(); } else if (lexeme == "if"){ bStatement = true; if(displayFlag){ cout << "<Statement> ::= <If>" << endl; printproduction("<Statement> ::= <If>"); } If(); } else if (lexeme == "return"){ bStatement = true; if(displayFlag){ cout << "<Statement> ::= <Return>" << endl; printproduction("<Statement> ::= <Return>"); } Return(); } else if (lexeme == "write"){ bStatement = true; if(displayFlag){ cout << "<Statement> ::= <Write>" << endl; printproduction("<Statement> ::= <Write>"); } Write(); } else if (lexeme == "read"){ bStatement = true; if(displayFlag){ cout << "<Statement> ::= <Read>" << endl; printproduction("<Statement> ::= <Read>"); } Read(); } else if (lexeme == "while"){ bStatement = true; if(displayFlag){ cout << "<Statement> ::= <While>" << endl; printproduction("<Statement> ::= <While>"); } While(); } return bStatement; }
//========================================================= bool Parser::FreeStatement () { PrintRule rule("FreeStatement"); return rule.Accept(If() || While() || For()); }
TreeNode* Parser::Statement() { kdDebug(0)<<"Parser::Statement()"<<endl; while (currentToken.type == tokEOL) getToken(); // statements can allways start on newlines switch (currentToken.type) { case tokLearn : return Learn(); break; case tokIf : return If(); break; case tokFor : return For(); break; case tokForEach : return ForEach(); break; case tokWhile : return While(); break; case tokRun : return ExternalRun(); break; case tokReturn : return Return(); break; case tokBreak : return Break(); break; case tokUnknown : return Other(); break; //assignment or function call case tokClear : return Clear(); break; case tokGo : return Go(); break; case tokGoX : return GoX(); break; case tokGoY : return GoY(); break; case tokForward : return Forward(); break; case tokBackward : return Backward(); break; case tokDirection : return Direction(); break; case tokTurnLeft : return TurnLeft(); break; case tokTurnRight : return TurnRight(); break; case tokCenter : return Center(); break; case tokSetPenWidth : return SetPenWidth(); break; case tokPenUp : return PenUp(); break; case tokPenDown : return PenDown(); break; case tokSetFgColor : return SetFgColor(); break; case tokSetBgColor : return SetBgColor(); break; case tokResizeCanvas : return ResizeCanvas(); break; case tokSpriteShow : return SpriteShow(); break; case tokSpriteHide : return SpriteHide(); break; case tokSpritePress : return SpritePress(); break; case tokSpriteChange : return SpriteChange(); break; case tokPrint : return Print(); break; case tokInputWindow : return InputWindow(); break; case tokMessage : return Message(); break; case tokFontType : return FontType(); break; case tokFontSize : return FontSize(); break; case tokRepeat : return Repeat(); break; case tokRandom : return Random(); break; case tokWait : return Wait(); break; case tokWrapOn : return WrapOn(); break; case tokWrapOff : return WrapOff(); break; case tokReset : return Reset(); break; case tokEOF : return EndOfFile(); break; case tokEnd : Error(currentToken, i18n("Cannot understand ']'"), 1050); getToken(); return new TreeNode(currentToken, Unknown); break; case tokBegin : Error(currentToken, i18n("Cannot understand '['"), 1050); getToken(); return new TreeNode(currentToken, Unknown); break; default : break; } if (currentToken.type != tokEnd) { Error(currentToken, i18n("Cannot understand '%1'").arg(currentToken.look), 1060); } getToken(); return new TreeNode(currentToken, Unknown); // fall-though for unknowns }