適当に放り投げる

もはやどうやって気分転換するかの問題だね。
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
;