aboutsummaryrefslogtreecommitdiffhomepage
path: root/docs/c_grammar.md
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-03-15 12:00:20 +0900
committernsfisis <nsfisis@gmail.com>2026-03-15 12:00:38 +0900
commite2021e3eecadec49542ab9a97660ce390a65f85a (patch)
tree9a1ccc481e8ef59c2b3ea0da1dd5ca5db74261e8 /docs/c_grammar.md
parent7435692fec7b82284eac236714931faee8b825d6 (diff)
downloadducc-e2021e3eecadec49542ab9a97660ce390a65f85a.tar.gz
ducc-e2021e3eecadec49542ab9a97660ce390a65f85a.tar.zst
ducc-e2021e3eecadec49542ab9a97660ce390a65f85a.zip
refactor: declaration parsing
Diffstat (limited to 'docs/c_grammar.md')
-rw-r--r--docs/c_grammar.md54
1 files changed, 34 insertions, 20 deletions
diff --git a/docs/c_grammar.md b/docs/c_grammar.md
index 807db1a..a41358c 100644
--- a/docs/c_grammar.md
+++ b/docs/c_grammar.md
@@ -375,49 +375,63 @@ balanced-token:
```
stmt:
- labeled-stmt
- unlabaled-stmt
-
-unlabaled-stmt:
- expr-stmt
- attribute-specifier-sequence? ( primary-block / jump-stmt )
-
-primary-block:
- compound-stmt
- selection-stmt
- iteration-stmt
+ { label }* unlabaled-stmt
label:
attribute-specifier-sequence? identifier ':'
attribute-specifier-sequence? 'case' constant-expr ':'
attribute-specifier-sequence? 'default' ':'
-labeled-stmt:
- label stmt
+unlabaled-stmt:
+ attribute-specifier-sequence? compound-stmt
+ attribute-specifier-sequence? if-stmt
+ attribute-specifier-sequence? switch-stmt
+ attribute-specifier-sequence? while-stmt
+ attribute-specifier-sequence? do-while-stmt
+ attribute-specifier-sequence? for-stmt
+ attribute-specifier-sequence? goto-stmt
+ attribute-specifier-sequence? continue-stmt
+ attribute-specifier-sequence? break-stmt
+ attribute-specifier-sequence? return-stmt
+ attribute-specifier-sequence? expr-stmt
compound-stmt:
- '{' block-item-list? '}'
+ '{' { block-item }* '}'
-block-item-list:
- { block-item }+
+block-item:
+ declaration
+ unlabaled-stmt
+ label
expr-stmt:
- attribute-specifier-sequence? expr? ';'
+ expr? ';'
-selection-stmt:
+if-stmt:
'if' '(' expr ')' stmt ( 'else' stmt )?
+
+switch-stmt:
'switch' '(' expr ')' stmt
-iteration-stmt:
+while-stmt:
'while' '(' expr ')' stmt
+
+do-while-stmt:
'do' stmt 'while' '(' expr ')' ';'
+
+for-stmt:
'for' '(' expr? ';' expr? ';' expr? ')' stmt
'for' '(' declaration expr? ';' expr? ')' stmt
-jump-stmt:
+goto-stmt:
'goto' identifier ';'
+
+continue-stmt:
'continue' ';'
+
+break-stmt:
'break' ';'
+
+return-stmt:
'return' expr? ';'
```