適当に放り投げる
もはやどうやって気分転換するかの問題だね。
JFlex+CUPですがCUPコードをyaccハイライトでどうぞ。
理想だけは頭の中で展開されるんだけど字句解析に構文解析に意味解析にやってみると本当大変だなあ。
まあまだ2日しか作業してない気もするけど。
package c; //import java_cup.runtime.*; /* Terminals */ terminal VAR; terminal ASSIGN; terminal ADD, SUB, MUL, DIV, MOD; terminal UPLUS, UMINUS; terminal IDENTIFIER, NUMBER; terminal SEMICOLON, COMMA, LPAREN, RPAREN, LBRACE, RBRACE; /* Non-terminals */ non terminal program; non terminal var_list, function_list; non terminal var_def, function_def; non terminal parameter_list, identifier_list; non terminal compound_statement, statement_list, statement; non terminal argument_list, lvalue, expr_list, expr; /* Precedences */ precedence right ASSIGN; precedence left ADD, SUB; precedence left MUL, DIV, MOD; precedence left UPLUS, UMINUS; /* The grammar */ // (var_def)* (function_def)* program ::= var_list function_list ; var_list ::= | var_list var_def ; var_def ::= VAR identifier_list SEMICOLON ; function_list ::= | function_list function_def ; function_def ::= IDENTIFIER LPAREN parameter_list RPAREN compound_statement ; // // a // a, b // a, b, c parameter_list ::= | identifier_list ; // a // a, b // a, b, c identifier_list ::= identifier_list COMMA IDENTIFIER | IDENTIFIER ; // {a; b; c;} compound_statement ::= LBRACE var_list statement_list RBRACE ; // a; b; c; statement_list ::= | statement_list statement ; statement ::= expr SEMICOLON | compound_statement ; lvalue ::= IDENTIFIER ; // function arguments argument_list ::= | expr_list ; expr_list ::= expr | argument_list COMMA expr ; expr ::= lvalue ASSIGN expr | expr ADD expr | expr SUB expr | expr MUL expr | expr DIV expr | expr MOD expr | ADD expr %prec UPLUS | SUB expr %prec UMINUS | LPAREN expr RPAREN // variable | IDENTIFIER // function call | IDENTIFIER LPAREN argument_list RPAREN | NUMBER ;