%{ void yyerror (char *s); /* Called by yyparse on error */ %} %union { char *str; int num; } %token TOK_FUNCTION %token TOK_IF %token TOK_STRING %token TOK_FOREACH %token TOK_FOR %token TOK_OBRACE %token TOK_CBRACE %token TOK_IN %token TOK_ELSE %token TOK_USE %token TOK_NOT %token TOK_OR %token TOK_AND %token TOK_RETURN %token TOK_IDENTIFIER %token TOK_LIT_INTEGER %token TOK_LIT_STRING %token TOK_WHITE %token TOK_ASSIGN /* Mathematics */ %left TOK_ADDITION TOK_SUBTRACT TOK_MULTIPLY TOK_DIVIDE %right TOK_MODULO /* Comparison */ %left TOK_LT %left TOK_LE %left TOK_GT %left TOK_GE %left TOK_NE %left TOK_EQ %left TOK_IM /* Bitwise */ %left TOK_BITWISE_AND %left TOK_BITWISE_OR %left TOK_BITWISE_XOR %left TOK_BITWISE_NOT %left TOK_SHL %left TOK_SHR /* Logical */ %left TOK_OR %left TOK_AND %left TOK_IMP %left TOK_NOT %% program : statement_list ; statement_list : statement lws ';' | statement lws ';' statement_list ; statement : expression | lws TOK_IF lws '(' expression lws ')' block ';' | lws TOK_IF lws '(' expression lws ')' block lws TOK_ELSE block ';' ; lws : | TOK_WHITE lws ; expression : lws TOK_IDENTIFIER /* Assignments */ | expression lws TOK_ASSIGN expression /* Comparison */ | expression lws TOK_EQ expression | expression lws TOK_LT expression | expression lws TOK_LE expression | expression lws TOK_GT expression | expression lws TOK_GE expression | expression lws TOK_NE expression | expression lws TOK_IM expression /* Bitwise */ | expression lws TOK_BITWISE_AND expression | expression lws TOK_BITWISE_OR expression | expression lws TOK_BITWISE_XOR expression | expression lws TOK_SHL expression | expression lws TOK_SHR expression | lws TOK_BITWISE_NOT expression /* Logical */ | expression lws TOK_OR expression | expression lws TOK_AND expression | expression lws TOK_IMP expression | lws TOK_NOT expression /* Arithmetic */ | expression lws TOK_MULTIPLY expression | expression lws TOK_DIVIDE expression | expression lws TOK_ADDITION expression | expression lws TOK_SUBTRACT expression | expression lws TOK_MODULO expression /* Contants */ | lws '[' argument_list lws ']' | lws TOK_LIT_STRING | lws TOK_LIT_INTEGER /* Misc */ | expression lws '?' expression lws ':' expression | expression lws '.' expression | lws '(' expression lws ')' | expression lws '(' argument_list lws ')' ; argument_list : expression | expression lws ',' argument_list ; block : lws '{' statement_list lws '}' ; %% void yyerror (char *s) /* Called by yyparse on error */ { printf ("%s\n", s); }