diff options
Diffstat (limited to 'grammars/c/grammar.txt')
-rw-r--r-- | grammars/c/grammar.txt | 76 |
1 files changed, 74 insertions, 2 deletions
diff --git a/grammars/c/grammar.txt b/grammars/c/grammar.txt index 7959318..ffe85c3 100644 --- a/grammars/c/grammar.txt +++ b/grammars/c/grammar.txt @@ -1,5 +1,6 @@ KEYWORDS list switch volatile case while do else const for if + struct union typedef void IDENT regex [a-zA-Z_][0-9a-zA-Z_]* @@ -16,6 +17,63 @@ OP list < <= > >= = . -> ? : +############### TYPE PARSING +# A PRIMITIVE_TYPE is the core object that takes up space after dereferencing, +# calling, etc. A normal variable declaration is PRIMITIVE_TYPE (expression) +PRIMITIVE_TYPE nonterm + struct IDENT + union IDENT + struct IDENT AGGREGATE_DECLARATION + union IDENT AGGREGATE_DECLARATION + const PRIMITIVE_TYPE + volatile PRIMITIVE_TYPE + void + IDENT + +# A TYPE_EXPRESSION is basically an lvalue expression. +TYPE_EXPRESSION nonterm + IDENT + TYPE_EXPRESSION [ ] + TYPE_EXPRESSION [ INT ] + * TYPE_EXPRESSION + ( TYPE_EXPRESSION ) + TYPE_EXPRESSION ( ) + TYPE_EXPRESSION ( ARGS ) + +DECLARATION nonterm + PRIMITIVE_TYPE TYPE_EXPRESSION + +# An ANONYMOUS_TYPE has no name +ANONYMOUS_TYPE nonterm + PRIMITIVE_TYPE + ANONYMOUS_TYPE [ ] + ANONYMOUS_TYPE [ INT ] + * ANONYMOUS_TYPE + ( ANONYMOUS_TYPE ) + ANONYMOUS_TYPE ( ) + ANONYMOUS_TYPE ( ARGS ) + +############### TOP LEVEL +TOP_LEVEL nonterm .start + TYPEDEF + FUNCTION + +ARGS nonterm + ANONYMOUS_TYPE + ANONYMOUS_TYPE , ARGS + DECLARATION + DECLARATION , ARGS + +FUNCTION nonterm + DECLARATION ( ) TRUE_BLOCK + DECLARATION ( ARGS ) TRUE_BLOCK + +AGGREGATE_DECLARATION nonterm + { STMTS } + +TYPEDEF nonterm + typedef PRIMITIVE_TYPE TYPE_EXPRESSION ; + EXPR nonterm INT IDENT @@ -40,19 +98,33 @@ FOR nonterm SWITCH nonterm switch ( EXPR ) BLOCK +DECLARATION_CHAIN nonterm + TYPE_EXPRESSION + TYPE_EXPRESSION , DECLARATION_CHAIN + TYPE_EXPRESSION = EXPR + TYPE_EXPRESSION = EXPR , DECLARATION_CHAIN + +DECLARATION_STATEMENT nonterm + PRIMITIVE_TYPE DECLARATION_CHAIN ; + STMT nonterm IF WHILE DO FOR SWITCH + # NOTE: it auto-prefers declarations right now + DECLARATION_STATEMENT .name DECL_STMT EXPR ; -STMTS nonterm .start +STMTS nonterm STMT STMT STMTS -BLOCK nonterm +TRUE_BLOCK nonterm { } { STMTS } + +BLOCK nonterm + TRUE_BLOCK STMT |