%{ #include #include using namespace std; extern "C" { int yylex(void); } extern FILE * yyin; void yyerror(const char * str) { fprintf(stderr, "error: %s\n", str); } int yywrap() { return 1; } %} %token ASSIGN; %token EQUAL; %token LEQ; %token GEQ; %token LSHIFT; %token RSHIFT; %token AND; %token OR; %token NOT; %token BIT_AND; %token BIT_OR; %token BIT_XOR; %token BIT_NEG; %token INCREMENT; %token DECREMENT; %token PLUS; %token MINUS; %token STAR; %token DIVIDE; %token MOD; %token SEMICOLON; %token COLON; %token QUESTION; %token DOLLAR; %token DOT; %token DOTDOTDOT; %token DQUOTE; %token SQUOTE; %token COMMA; %token LCURLY; %token RCURLY; %token LBRACKET; %token RBRACKET; %token LPAREN; %token RPAREN; %token BIN_NUMBER; %token HEX_NUMBER; %token OCT_NUMBER; %token DEC_NUMBER; %token ALIAS; %token MODULE; %token RETURN; %token USE; %token U1; %token I8; %token U8; %token I16; %token U16; %token I32; %token U32; %token I64; %token U64; %token FLOAT; %token DOUBLE; %token VOID; %token FFIID; %token ID; %% program: /* empty */ | use program | module program { printf("Saw a module declaration\n"); } | ffidecl program { printf("Saw a ffidecl\n"); } | number program { printf("Saw a number\n"); } | assignment program { printf("Saw an assignment\n"); } ; use: USE modname SEMICOLON; module: MODULE modname SEMICOLON; modname: ID more_modname ; more_modname: /* empty */ | DOT ID more_modname ; ffidecl: type FFIID DOT ID LPAREN arglist RPAREN SEMICOLON; type: U1 | I8 | U8 | I16 | U16 | I32 | U32 | I64 | U64 | FLOAT | DOUBLE | ID | type STAR ; arglist: /* empty */ | var_decl more_arglist ; more_arglist: /* empty */ | COMMA var_decl more_arglist | COMMA DOTDOTDOT ; var_decl: type ID ; number: BIN_NUMBER | OCT_NUMBER | DEC_NUMBER | HEX_NUMBER ; assignment: ID ASSIGN number SEMICOLON ; %% int main(int argc, char * argv[]) { if (argc > 1) { yyin = fopen(argv[1], "r"); if (yyin == NULL) { cerr << "Failed to open file '" << argv[1] << "'" << endl; return -1; } } yyparse(); }