c.y 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. /*
  2. * This grammar sourced from:
  3. * http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
  4. */
  5. %{
  6. %}
  7. %token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF
  8. %token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
  9. %token BOOL_AND_OP BOOL_OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
  10. %token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
  11. %token XOR_ASSIGN OR_ASSIGN TYPE_NAME
  12. %token LPAREN RPAREN LBRACKET RBRACKET LBRACE RBRACE
  13. %token PERIOD COMMA COLON SEMICOLON QUESTIONMARK
  14. %token PLUS MINUS STAR SLASH ASSIGN AND_OP OR_OP
  15. %token BANG TILDE PERCENT CIRCUMFLEX
  16. %token GT_OP LT_OP
  17. %token TYPEDEF EXTERN STATIC AUTO REGISTER
  18. %token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID
  19. %token STRUCT UNION ENUM ELLIPSIS
  20. %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
  21. %left COMMA
  22. %right ASSIGN ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN
  23. %right QUESTIONMARK COLON
  24. %left BOOL_OR_OP
  25. %left BOOL_AND_OP
  26. %left OR_OP
  27. %left CIRCUMFLEX
  28. %left AND_OP
  29. %left EQ_OP NE_OP
  30. %left LT_OP GT_OP LE_OP GE_OP
  31. %left LEFT_OP RIGHT_OP
  32. %left PLUS MINUS
  33. %left STAR SLASH PERCENT
  34. %right NOT NEG
  35. %right INC_OP SIZEOF DEC_OP
  36. %left LBRACKET LPAREN PERIOD PTR_OP
  37. %start translation_unit
  38. %%
  39. primary_expression
  40. : IDENTIFIER
  41. | CONSTANT
  42. | STRING_LITERAL
  43. | LPAREN expression RPAREN
  44. ;
  45. postfix_expression
  46. : primary_expression
  47. | postfix_expression LBRACKET expression RBRACKET
  48. | postfix_expression LPAREN RPAREN
  49. | postfix_expression LPAREN argument_expression_list RPAREN
  50. | postfix_expression PERIOD IDENTIFIER
  51. | postfix_expression PTR_OP IDENTIFIER
  52. | postfix_expression INC_OP
  53. | postfix_expression DEC_OP
  54. ;
  55. argument_expression_list
  56. : assignment_expression
  57. | argument_expression_list COMMA assignment_expression
  58. ;
  59. unary_expression
  60. : postfix_expression
  61. | INC_OP unary_expression
  62. | DEC_OP unary_expression
  63. | unary_operator cast_expression
  64. | SIZEOF unary_expression
  65. | SIZEOF LPAREN type_name RPAREN
  66. ;
  67. unary_operator
  68. : AND_OP
  69. | STAR
  70. | PLUS
  71. | MINUS
  72. | TILDE
  73. | BANG
  74. ;
  75. cast_expression
  76. : unary_expression
  77. | LPAREN type_name RPAREN cast_expression
  78. ;
  79. multiplicative_expression
  80. : cast_expression
  81. | multiplicative_expression STAR cast_expression
  82. | multiplicative_expression SLASH cast_expression
  83. | multiplicative_expression PERCENT cast_expression
  84. ;
  85. additive_expression
  86. : multiplicative_expression
  87. | additive_expression PLUS multiplicative_expression
  88. | additive_expression MINUS multiplicative_expression
  89. ;
  90. shift_expression
  91. : additive_expression
  92. | shift_expression LEFT_OP additive_expression
  93. | shift_expression RIGHT_OP additive_expression
  94. ;
  95. relational_expression
  96. : shift_expression
  97. | relational_expression LT_OP shift_expression
  98. | relational_expression GT_OP shift_expression
  99. | relational_expression LE_OP shift_expression
  100. | relational_expression GE_OP shift_expression
  101. ;
  102. equality_expression
  103. : relational_expression
  104. | equality_expression EQ_OP relational_expression
  105. | equality_expression NE_OP relational_expression
  106. ;
  107. and_expression
  108. : equality_expression
  109. | and_expression AND_OP equality_expression
  110. ;
  111. exclusive_or_expression
  112. : and_expression
  113. | exclusive_or_expression CIRCUMFLEX and_expression
  114. ;
  115. inclusive_or_expression
  116. : exclusive_or_expression
  117. | inclusive_or_expression OR_OP exclusive_or_expression
  118. ;
  119. logical_and_expression
  120. : inclusive_or_expression
  121. | logical_and_expression BOOL_AND_OP inclusive_or_expression
  122. ;
  123. logical_or_expression
  124. : logical_and_expression
  125. | logical_or_expression BOOL_OR_OP logical_and_expression
  126. ;
  127. conditional_expression
  128. : logical_or_expression
  129. | logical_or_expression QUESTIONMARK expression COLON conditional_expression
  130. ;
  131. assignment_expression
  132. : conditional_expression
  133. | unary_expression assignment_operator assignment_expression
  134. ;
  135. assignment_operator
  136. : ASSIGN
  137. | MUL_ASSIGN
  138. | DIV_ASSIGN
  139. | MOD_ASSIGN
  140. | ADD_ASSIGN
  141. | SUB_ASSIGN
  142. | LEFT_ASSIGN
  143. | RIGHT_ASSIGN
  144. | AND_ASSIGN
  145. | XOR_ASSIGN
  146. | OR_ASSIGN
  147. ;
  148. expression
  149. : assignment_expression
  150. | expression COMMA assignment_expression
  151. ;
  152. constant_expression
  153. : conditional_expression
  154. ;
  155. declaration
  156. : declaration_specifiers SEMICOLON
  157. | declaration_specifiers init_declarator_list SEMICOLON
  158. ;
  159. declaration_specifiers
  160. : storage_class_specifier
  161. | storage_class_specifier declaration_specifiers
  162. | type_specifier
  163. | type_specifier declaration_specifiers
  164. | type_qualifier
  165. | type_qualifier declaration_specifiers
  166. ;
  167. init_declarator_list
  168. : init_declarator
  169. | init_declarator_list COMMA init_declarator
  170. ;
  171. init_declarator
  172. : declarator
  173. | declarator ASSIGN initializer
  174. ;
  175. storage_class_specifier
  176. : TYPEDEF
  177. | EXTERN
  178. | STATIC
  179. | AUTO
  180. | REGISTER
  181. ;
  182. type_specifier
  183. : VOID
  184. | CHAR
  185. | SHORT
  186. | INT
  187. | LONG
  188. | FLOAT
  189. | DOUBLE
  190. | SIGNED
  191. | UNSIGNED
  192. | struct_or_union_specifier
  193. | enum_specifier
  194. | TYPE_NAME
  195. ;
  196. struct_or_union_specifier
  197. : struct_or_union IDENTIFIER LBRACE struct_declaration_list RBRACE
  198. | struct_or_union LBRACE struct_declaration_list RBRACE
  199. | struct_or_union IDENTIFIER
  200. ;
  201. struct_or_union
  202. : STRUCT
  203. | UNION
  204. ;
  205. struct_declaration_list
  206. : struct_declaration
  207. | struct_declaration_list struct_declaration
  208. ;
  209. struct_declaration
  210. : specifier_qualifier_list struct_declarator_list SEMICOLON
  211. ;
  212. specifier_qualifier_list
  213. : type_specifier specifier_qualifier_list
  214. | type_specifier
  215. | type_qualifier specifier_qualifier_list
  216. | type_qualifier
  217. ;
  218. struct_declarator_list
  219. : struct_declarator
  220. | struct_declarator_list COMMA struct_declarator
  221. ;
  222. struct_declarator
  223. : declarator
  224. | COLON constant_expression
  225. | declarator COLON constant_expression
  226. ;
  227. enum_specifier
  228. : ENUM LBRACE enumerator_list RBRACE
  229. | ENUM IDENTIFIER LBRACE enumerator_list RBRACE
  230. | ENUM IDENTIFIER
  231. ;
  232. enumerator_list
  233. : enumerator
  234. | enumerator_list COMMA enumerator
  235. ;
  236. enumerator
  237. : IDENTIFIER
  238. | IDENTIFIER ASSIGN constant_expression
  239. ;
  240. type_qualifier
  241. : CONST
  242. | VOLATILE
  243. ;
  244. declarator
  245. : pointer direct_declarator
  246. | direct_declarator
  247. ;
  248. direct_declarator
  249. : IDENTIFIER
  250. | LPAREN declarator RPAREN
  251. | direct_declarator LBRACKET constant_expression RBRACKET
  252. | direct_declarator LBRACKET RBRACKET
  253. | direct_declarator LPAREN parameter_type_list RPAREN
  254. | direct_declarator LPAREN identifier_list RPAREN
  255. | direct_declarator LPAREN RPAREN
  256. ;
  257. pointer
  258. : STAR
  259. | STAR type_qualifier_list
  260. | STAR pointer
  261. | STAR type_qualifier_list pointer
  262. ;
  263. type_qualifier_list
  264. : type_qualifier
  265. | type_qualifier_list type_qualifier
  266. ;
  267. parameter_type_list
  268. : parameter_list
  269. | parameter_list COMMA ELLIPSIS
  270. ;
  271. parameter_list
  272. : parameter_declaration
  273. | parameter_list COMMA parameter_declaration
  274. ;
  275. parameter_declaration
  276. : declaration_specifiers declarator
  277. | declaration_specifiers abstract_declarator
  278. | declaration_specifiers
  279. ;
  280. identifier_list
  281. : IDENTIFIER
  282. | identifier_list COMMA IDENTIFIER
  283. ;
  284. type_name
  285. : specifier_qualifier_list
  286. | specifier_qualifier_list abstract_declarator
  287. ;
  288. abstract_declarator
  289. : pointer
  290. | direct_abstract_declarator
  291. | pointer direct_abstract_declarator
  292. ;
  293. direct_abstract_declarator
  294. : LPAREN abstract_declarator RPAREN
  295. | LBRACKET RBRACKET
  296. | LBRACKET constant_expression RBRACKET
  297. | direct_abstract_declarator LBRACKET RBRACKET
  298. | direct_abstract_declarator LBRACKET constant_expression RBRACKET
  299. | LPAREN RPAREN
  300. | LPAREN parameter_type_list RPAREN
  301. | direct_abstract_declarator LPAREN RPAREN
  302. | direct_abstract_declarator LPAREN parameter_type_list RPAREN
  303. ;
  304. initializer
  305. : assignment_expression
  306. | LBRACE initializer_list RBRACE
  307. | LBRACE initializer_list COMMA RBRACE
  308. ;
  309. initializer_list
  310. : initializer
  311. | initializer_list COMMA initializer
  312. ;
  313. statement
  314. : labeled_statement
  315. | compound_statement
  316. | expression_statement
  317. | selection_statement
  318. | iteration_statement
  319. | jump_statement
  320. ;
  321. labeled_statement
  322. : IDENTIFIER COLON statement
  323. | CASE constant_expression COLON statement
  324. | DEFAULT COLON statement
  325. ;
  326. compound_statement
  327. : LBRACE RBRACE
  328. | LBRACE statement_list RBRACE
  329. | LBRACE declaration_list RBRACE
  330. | LBRACE declaration_list statement_list RBRACE
  331. ;
  332. declaration_list
  333. : declaration
  334. | declaration_list declaration
  335. ;
  336. statement_list
  337. : statement
  338. | statement_list statement
  339. ;
  340. expression_statement
  341. : SEMICOLON
  342. | expression SEMICOLON
  343. ;
  344. selection_statement
  345. : IF LPAREN expression RPAREN statement
  346. | IF LPAREN expression RPAREN statement ELSE statement
  347. | SWITCH LPAREN expression RPAREN statement
  348. ;
  349. iteration_statement
  350. : WHILE LPAREN expression RPAREN statement
  351. | DO statement WHILE LPAREN expression RPAREN SEMICOLON
  352. | FOR LPAREN expression_statement expression_statement RPAREN statement
  353. | FOR LPAREN expression_statement expression_statement expression RPAREN statement
  354. ;
  355. jump_statement
  356. : GOTO IDENTIFIER SEMICOLON
  357. | CONTINUE SEMICOLON
  358. | BREAK SEMICOLON
  359. | RETURN SEMICOLON
  360. | RETURN expression SEMICOLON
  361. ;
  362. translation_unit
  363. : external_declaration
  364. | translation_unit external_declaration
  365. ;
  366. external_declaration
  367. : function_definition
  368. | declaration
  369. ;
  370. function_definition
  371. : declaration_specifiers declarator declaration_list compound_statement
  372. | declaration_specifiers declarator compound_statement
  373. | declarator declaration_list compound_statement
  374. | declarator compound_statement
  375. ;
  376. %%
  377. #include <stdio.h>
  378. extern char yytext[];
  379. extern int column;
  380. yyerror(s)
  381. char *s;
  382. {
  383. fflush(stdout);
  384. printf("\n%*s\n%*s\n", column, "^", column, s);
  385. }