summaryrefslogtreecommitdiff
path: root/grammars/c/grammar.txt
diff options
context:
space:
mode:
Diffstat (limited to 'grammars/c/grammar.txt')
-rw-r--r--grammars/c/grammar.txt76
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
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback