# C-val Compiler ## Lexical Spec * LBRACK `[` * RBRACK `]` * LCURLY `{` * RCURLY `}` * LPAREN `(` * RPAREN `)` * ID `[any character without whitespace]+` * SEMI `;` * COMMA `,` * ARROW `->` * STAR `*` * ANDREF `&` * DOLLAR `$` * COMMENT `//` * NUM `[0-9]*` * VAL * STRING `"{any}"` ## Syntax Spec ```c program := defn* defn := VAL type ID ; | VAL type ID expr ; type := ID | type STAR | LBRACK RBRACK | LBRACK type RBRACK | LBRACK type* ARROW type? RBRACK expr := atom atom* atom := ID | NUM | STR | lambda | compound | STAR | ANDREF stmt := defn | expr ; // expr statement | return expr ; // return statement | DOLLAR ID expr ; // assignment statement | if expr compound ; // if statement | if expr compound else compound ; // if-else statement param_list := LPAREN (type ID)* RPAREN lambda := param_list compound compound := LCURLY (stmt)* expr? RCURLY ``` ### AST Spec ```c NODE_PROGRAM: token: PROGRAM children: NODE_DEFN* NODE_DEFN: token: VAL children: NODE_TYPE, TOKEN_ID, (NODE_EXPR)? children_count: 2 | 3 NODE_TYPE_SIMPLE: token: ID children: NODE_ID NODE_TYPE_STAR* children_count: 1+ NODE_TYPE_COMPLEX: token: COMPLEX_TYPE children: NODE_TYPE_PARAM NODE_TYPE_OUT NODE_TYPE_PARAM token: TYPE_PARAM children: (NODE_TYPE | NODE_TYPE_COMPLEX)* children_count: 0+ NODE_TYPE_OUT token: TYPE_OUT children: (NODE_TYPE | NODE_TYPE_COMPLEX)? NODE_EXPR: token: EXPR children: (atom)+ // atom definition NODE_NUM: token: NUM NODE_STR: token: STR NODE_LAMBDA: token: LAMBDA children: NODE_PARAM_LIST NODE_COMPOUND NODE_COMPOUND: token: COMPOUND children: (NODE_STMT)* (NODE_EXPR)? children_count: 0+ NODE_PARAM_LIST: token: PARAM_LIST children: NODE_PARAM* NODE_PARAM: token: PARAM children: NODE_TYPE, TOKEN_ID ```