%{ #include #include #include int yylex(); void yyerror( const char *error ) { printf("%s\n", error ); } %} %union { int64_t iValue; double dValue; Bu::String *sValue; bool bValue; } %token tokGame %token tokFunction %token tokSituation %token tokWhile %token tokFor %token tokEach %token tokIn %token tokIf %token tokThen %token tokElse %token tokCommand %token tokSituationName %token tokIdent %token tokGoto %token tokString %token tokInt %token tokFloat %token tokBool %token tokNull %destructor { delete $$; printf("string deleted.\n"); } tokString tokSituationName %token eos 0 "end of stream" %left '(' ')' '[' ']' %left '*' '/' %left '-' '+' %% input: gameDecl bodyDecl ; gameDecl: tokGame '{' gameExprList '}' ; gameExprList: | gameExprList cmpltGameExpr ; cmpltGameExpr: gameExpr ';' ; gameExpr: tokIdent '=' expr ; bodyDecl: | bodyDecl situation | bodyDecl function ; situation: tokSituation tokSituationName { printf("Read situtaion: %s\n", (*$2).getStr() ); } '{' cmpltExprList '}' ; function: tokFunction tokIdent '(' ')' '{' '}' ; cmpltExprList: | cmpltExprList cmpltExpr ; cmpltExpr: expr ';' | tokGoto '(' expr ')' ';' ; expr: tokInt | tokFloat | tokString | tokBool | tokNull | tokSituationName | expr '+' expr | expr '-' expr | expr '/' expr | expr '*' expr | '(' expr ')' | expr '[' expr ']' | '[' ']' | '[' listValues ']' | '{' '}' | '{' dictValues '}' ; listValues: expr | listValues ',' expr ; dictValues: expr ':' expr | dictValues ',' expr ':' expr ; %% int main() { yyparse(); return 0; }