PageRenderTime 57ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/parser.y

https://github.com/gitpan/Rinchi-CPlusPlus-Preprocessor
Happy | 1307 lines | 1065 code | 242 blank | 0 comment | 0 complexity | 9b5128bd8f4c613fe76d4762a5600cac MD5 | raw file
  1. %{
  2. /*
  3. * UUID: db754b9f-f2fd-11dc-b899-00502c05c241
  4. * Author: Brian M. Ames, bames@apk.net
  5. * Copyright: Copyright (C) 2008 by Brian M. Ames
  6. */
  7. #include <stdio.h>
  8. #include "parser_routines.h"
  9. #include "tree.h"
  10. #include "lexer.h"
  11. #define YYDEBUG 1
  12. #define YYERROR_VERBOSE 1
  13. //define YYSTYPE int
  14. char *getCurrentFilename();
  15. void yyerror(char const *s);
  16. int yypp_lex (void);
  17. %}
  18. %no-lines
  19. %name-prefix="yypp_"
  20. %locations
  21. %union {
  22. float fval;
  23. char *sval;
  24. unsigned int uval;
  25. int ival;
  26. long lval;
  27. }
  28. %token ECS_NULL
  29. %token ASC_SOH
  30. %token ASC_STX
  31. %token ASC_ETX
  32. %token ASC_EOT
  33. %token ASC_ENQ
  34. %token ASC_ACK
  35. %token ECS_ALERT
  36. %token ECS_BACKSPACE
  37. %token BCS_WHTSP_TAB
  38. %token BCS_WHTSP_NEWLINE
  39. %token BCS_WHTSP_VERTICAL_TAB
  40. %token BCS_WHTSP_FORMFEED
  41. %token ECS_CARRIAGE_RETURN
  42. %token ASC_SHIFT_OUT
  43. %token ASC_SHIFT_IN
  44. %token ASC_DLE
  45. %token ASC_DC1
  46. %token ASC_DC2
  47. %token ASC_DC3
  48. %token ASC_DC4
  49. %token ASC_NAK
  50. %token ASC_SYN
  51. %token ASC_ETB
  52. %token ASC_CAN
  53. %token ASC_EM
  54. %token ASC_SUB
  55. %token ASC_ESC
  56. %token ASC_IS4
  57. %token ASC_IS3
  58. %token ASC_IS2
  59. %token ASC_IS1
  60. %token BCS_WHTSP_SPACE
  61. %token BCS_PUNCT_EXCLAMATION
  62. %token BCS_PUNCT_QUOTE
  63. %token BCS_PUNCT_HASH
  64. %token ASC_DOLLAR_SIGN
  65. %token BCS_PUNCT_PERCENT
  66. %token BCS_PUNCT_AMPERSAND
  67. %token BCS_PUNCT_APOSTROPHE
  68. %token BCS_PUNCT_OPEN_PARENTHESIS
  69. %token BCS_PUNCT_CLOSE_PARENTHESIS
  70. %token BCS_PUNCT_ASTERISK
  71. %token BCS_PUNCT_PLUS
  72. %token BCS_PUNCT_COMMA
  73. %token BCS_PUNCT_MINUS
  74. %token BCS_PUNCT_PERIOD
  75. %token BCS_PUNCT_SLASH
  76. %token BCS_DIGIT_0
  77. %token BCS_DIGIT_1
  78. %token BCS_DIGIT_2
  79. %token BCS_DIGIT_3
  80. %token BCS_DIGIT_4
  81. %token BCS_DIGIT_5
  82. %token BCS_DIGIT_6
  83. %token BCS_DIGIT_7
  84. %token BCS_DIGIT_8
  85. %token BCS_DIGIT_9
  86. %token BCS_PUNCT_COLON
  87. %token BCS_PUNCT_SEMICOLON
  88. %token BCS_PUNCT_LESS_THAN
  89. %token BCS_PUNCT_EQUAL
  90. %token BCS_PUNCT_GREATER_THAN
  91. %token BCS_PUNCT_QUESTION
  92. %token ASC_AT_SIGN
  93. %token BCS_UPPER_A
  94. %token BCS_UPPER_B
  95. %token BCS_UPPER_C
  96. %token BCS_UPPER_D
  97. %token BCS_UPPER_E
  98. %token BCS_UPPER_F
  99. %token BCS_UPPER_G
  100. %token BCS_UPPER_H
  101. %token BCS_UPPER_I
  102. %token BCS_UPPER_J
  103. %token BCS_UPPER_K
  104. %token BCS_UPPER_L
  105. %token BCS_UPPER_M
  106. %token BCS_UPPER_N
  107. %token BCS_UPPER_O
  108. %token BCS_UPPER_P
  109. %token BCS_UPPER_Q
  110. %token BCS_UPPER_R
  111. %token BCS_UPPER_S
  112. %token BCS_UPPER_T
  113. %token BCS_UPPER_U
  114. %token BCS_UPPER_V
  115. %token BCS_UPPER_W
  116. %token BCS_UPPER_X
  117. %token BCS_UPPER_Y
  118. %token BCS_UPPER_Z
  119. %token BCS_PUNCT_OPEN_BRACKET
  120. %token BCS_PUNCT_BACKSLASH
  121. %token BCS_PUNCT_CLOSE_BRACKET
  122. %token BCS_PUNCT_CARET
  123. %token BCS_PUNCT_UNDERSCORE
  124. %token BCS_LOWER_A
  125. %token BCS_LOWER_B
  126. %token BCS_LOWER_C
  127. %token BCS_LOWER_D
  128. %token BCS_LOWER_E
  129. %token BCS_LOWER_F
  130. %token BCS_LOWER_G
  131. %token BCS_LOWER_H
  132. %token BCS_LOWER_I
  133. %token BCS_LOWER_J
  134. %token BCS_LOWER_K
  135. %token BCS_LOWER_L
  136. %token BCS_LOWER_M
  137. %token BCS_LOWER_N
  138. %token BCS_LOWER_O
  139. %token BCS_LOWER_P
  140. %token BCS_LOWER_Q
  141. %token BCS_LOWER_R
  142. %token BCS_LOWER_S
  143. %token BCS_LOWER_T
  144. %token BCS_LOWER_U
  145. %token BCS_LOWER_V
  146. %token BCS_LOWER_W
  147. %token BCS_LOWER_X
  148. %token BCS_LOWER_Y
  149. %token BCS_LOWER_Z
  150. %token BCS_PUNCT_OPEN_BRACE
  151. %token BCS_PUNCT_VERTICAL_BAR
  152. %token BCS_PUNCT_CLOSE_BRACE
  153. %token BCS_PUNCT_TILDE
  154. %token ASC_DEL
  155. %token ALT_PUNCT_OPEN_BRACE
  156. %token ALT_PUNCT_CLOSE_BRACE
  157. %token ALT_PUNCT_OPEN_BRACKET
  158. %token ALT_PUNCT_CLOSE_BRACKET
  159. %token ALT_PUNCT_HASH
  160. %token KWD_ASM
  161. %token KWD_AUTO
  162. %token KWD_BOOL
  163. %token KWD_BREAK
  164. %token KWD_CASE
  165. %token KWD_CATCH
  166. %token KWD_CHAR
  167. %token KWD_CLASS
  168. %token KWD_CONST
  169. %token KWD_CONST_CAST
  170. %token KWD_CONTINUE
  171. %token KWD_DEFAULT
  172. %token KWD_DEFINED
  173. %token KWD_DELETE
  174. %token KWD_DO
  175. %token KWD_DOUBLE
  176. %token KWD_DYNAMIC_CAST
  177. %token KWD_ELSE
  178. %token KWD_ENUM
  179. %token KWD_EXPLICIT
  180. %token KWD_EXPORT
  181. %token KWD_EXTERN
  182. %token KWD_FALSE
  183. %token KWD_FLOAT
  184. %token KWD_FOR
  185. %token KWD_FRIEND
  186. %token KWD_GOTO
  187. %token KWD_IF
  188. %token KWD_INLINE
  189. %token KWD_INT
  190. %token KWD_LONG
  191. %token KWD_MUTABLE
  192. %token KWD_NAMESPACE
  193. %token KWD_NEW
  194. %token KWD_OPERATOR
  195. %token KWD_PRIVATE
  196. %token KWD_PROTECTED
  197. %token KWD_PUBLIC
  198. %token KWD_REGISTER
  199. %token KWD_REINTERPRET_CAST
  200. %token KWD_RETURN
  201. %token KWD_SHORT
  202. %token KWD_SIGNED
  203. %token KWD_SIZEOF
  204. %token KWD_STATIC
  205. %token KWD_STATIC_CAST
  206. %token KWD_STRUCT
  207. %token KWD_SWITCH
  208. %token KWD_TEMPLATE
  209. %token KWD_THIS
  210. %token KWD_THROW
  211. %token KWD_TRUE
  212. %token KWD_TRY
  213. %token KWD_TYPEDEF
  214. %token KWD_TYPENAME
  215. %token KWD_TYPEID
  216. %token KWD_UNION
  217. %token KWD_UNSIGNED
  218. %token KWD_USING
  219. %token KWD_VIRTUAL
  220. %token KWD_VOID
  221. %token KWD_VOLATILE
  222. %token KWD_WCHAR_T
  223. %token KWD_WHILE
  224. %token PPD_NULL
  225. %token PPD_DEFINE
  226. %token PPD_ELIF
  227. %token PPD_ELSE
  228. %token PPD_ENDIF
  229. %token PPD_ERROR
  230. %token PPD_IF
  231. %token PPD_IFDEF
  232. %token PPD_IFNDEF
  233. %token PPD_INCLUDE
  234. %token PPD_LINE
  235. %token PPD_PRAGMA
  236. %token PPD_UNDEF
  237. %token OP_LOGICAL_NOT
  238. %token OP_NE
  239. %token OP_STRINGIZE
  240. %token OP_TOKEN_SPLICE
  241. %token OP_MODULO
  242. %token ALT_OP_TOKEN_SPLICE
  243. %token OP_ASSIGN_MODULO
  244. %token OP_BIT_AND
  245. %token OP_ADDRESS
  246. %token OP_LOGICAL_AND
  247. %token OP_ASSIGN_BIT_AND
  248. %token OP_DEREFERENCE
  249. %token OP_MULTIPLY
  250. %token OP_ASSIGN_MULTIPLY
  251. %token OP_PLUS
  252. %token OP_INCREMENT
  253. %token OP_ASSIGN_PLUS
  254. %token OP_MINUS
  255. %token OP_DECREMENT
  256. %token OP_ASSIGN_MINUS
  257. %token OP_POINTER_MEMBER
  258. %token OP_POINTER_POINTER_TO_MEMBER
  259. %token OP_OBJECT_MEMBER
  260. %token OP_OBJECT_POINTER_TO_MEMBER
  261. %token OP_DIVIDE
  262. %token OP_ASSIGN_DIVIDE
  263. %token OP_ELSE
  264. %token OP_SCOPE_REF
  265. %token OP_LT
  266. %token OP_SHIFT_LEFT
  267. %token OP_ASSIGN_SHIFT_LEFT
  268. %token OP_LE
  269. %token OP_ASSIGN
  270. %token OP_EQ
  271. %token OP_GT
  272. %token OP_GE
  273. %token OP_SHIFT_RIGHT
  274. %token OP_ASSIGN_SHIFT_RIGHT
  275. %token OP_CONDITIONAL
  276. %token OP_BIT_PLUS
  277. %token OP_ASSIGN_BIT_PLUS
  278. %token OP_BIT_OR
  279. %token OP_ASSIGN_BIT_OR
  280. %token OP_LOGICAL_OR
  281. %token OP_BIT_NOT
  282. %token OP_ALT_LOGICAL_AND
  283. %token OP_ALT_ASSIGN_BIT_AND
  284. %token OP_ALT_BIT_AND
  285. %token OP_ALT_BIT_OR
  286. %token OP_ALT_BIT_NOT
  287. %token OP_ALT_LOGICAL_NOT
  288. %token OP_ALT_NE
  289. %token OP_ALT_LOGICAL_OR
  290. %token OP_ALT_ASSIGN_BIT_OR
  291. %token OP_ALT_BIT_PLUS
  292. %token OP_ALT_ASSIGN_BIT_PLUS
  293. %token INV_ALT_LOGICAL_AND
  294. %token INV_ALT_ASSIGN_BIT_AND
  295. %token INV_ALT_BIT_AND
  296. %token INV_ALT_BIT_OR
  297. %token INV_ALT_BIT_NOT
  298. %token INV_ALT_LOGICAL_NOT
  299. %token INV_ALT_NE
  300. %token INV_ALT_LOGICAL_OR
  301. %token INV_ALT_ASSIGN_BIT_OR
  302. %token INV_ALT_BIT_PLUS
  303. %token INV_ALT_ASSIGN_BIT_PLUS
  304. %token INV_MFI_LOGICAL_AND
  305. %token INV_MFI_ASSIGN_BIT_AND
  306. %token INV_MFI_BIT_AND
  307. %token INV_MFI_BIT_OR
  308. %token INV_MFI_BIT_NOT
  309. %token INV_MFI_LOGICAL_NOT
  310. %token INV_MFI_NE
  311. %token INV_MFI_LOGICAL_OR
  312. %token INV_MFI_ASSIGN_BIT_OR
  313. %token INV_MFI_BIT_PLUS
  314. %token INV_MFI_ASSIGN_BIT_PLUS
  315. %token DECL_REFERENCE
  316. %token DECL_POINTER
  317. %token DECL_VAR_ARGS
  318. %token SYSTEM_HEADER_STRING
  319. %token HEADER_STRING
  320. %token IDENTIFIER
  321. %token NON_REPLACEABLE_IDENTIFIER
  322. %token MACRO_FUNCTION_IDENTIFIER
  323. %token MACRO_OBJECT_IDENTIFIER
  324. %token REPLACED_IDENTIFIER
  325. %token PP_NUMBER
  326. %token CHARACTER_LITERAL
  327. %token L_CHARACTER_LITERAL
  328. %token STRING_LITERAL
  329. %token L_STRING_LITERAL
  330. %token <lval> INTEGER_LITERAL
  331. %token <lval> OCTAL_LITERAL
  332. %token <lval> DECIMAL_LITERAL
  333. %token <lval> HEXADECIMAL_LITERAL
  334. %token FLOATING_LITERAL
  335. %token <sval> UNIVERSAL_CHARACTER_NAME
  336. %token <sval> USE_ON_CODE
  337. %token PUNC_INITIALIZE
  338. %token PUNC_SYNONYM
  339. %token DONT_CARE
  340. %token <sval> RESERVED_WORD
  341. %token <sval> ACCESS_SPECIFIER
  342. %token <ival> BOOLEAN_LITERAL
  343. %token <sval> CV_QUALIFIER
  344. %token <sval> INTRINSIC_TYPE
  345. %token <sval> FUNCTION_SPECIFIER
  346. %token <sval> STORAGE_CLASS_SPECIFIER
  347. %token <sval> USER_TOKEN
  348. %token <sval> SYMBOL
  349. %token <sval> COMMENT
  350. %token <sval> BLOCK_COMMENT
  351. %token END_OF_STATEMENT
  352. %token BLOCK_OPEN
  353. %token BLOCK_CLOSE
  354. %token LIST_OPEN
  355. %token LIST_SEPARATOR
  356. %token LIST_CLOSE
  357. %type <lval> pp_constant_expression
  358. %type <lval> pp_expression
  359. %type <lval> pp_conditional_expression
  360. %type <lval> pp_logical_or_expression
  361. %type <lval> pp_logical_and_expression
  362. %type <lval> pp_inclusive_or_expression
  363. %type <lval> pp_exclusive_or_expression
  364. %type <lval> pp_and_expression
  365. %type <lval> pp_equality_expression
  366. %type <lval> pp_relational_expression
  367. %type <lval> pp_shift_expression
  368. %type <lval> pp_additive_expression
  369. %type <lval> pp_multiplicative_expression
  370. %type <lval> pp_unary_expression
  371. %type <lval> pp_primary_expression
  372. %type <lval> pp_boolean_literal
  373. %type <lval> pp_integer_literal
  374. %type <lval> pp_octal_literal
  375. %type <lval> pp_decimal_literal
  376. %type <lval> pp_hexadecimal_literal
  377. %%
  378. preprocessing_file: { handle_file_begin(preprocessing_file_index); } group_part_seq_opt {handle_file_end(preprocessing_file_index); }
  379. ;
  380. group_part_seq_opt: /* empty */
  381. | group_part_seq
  382. ;
  383. group_part_seq: group_part
  384. | group_part_seq group_part
  385. ;
  386. group_part: { /* handle_token(group_part_index); */ } preprocessing_token_seq_opt new_line
  387. | if_section
  388. | control_line
  389. ;
  390. if_section: if_group elif_group_seq_opt else_group_opt endif_line
  391. ;
  392. if_open: PPD_IF pp_constant_expression { handle_if_open(PPD_IF_INDEX, $2); }
  393. | PPD_IF string_literal { handle_if_open(PPD_IF_INDEX, 0); }
  394. ;
  395. ifdef_open: PPD_IFDEF
  396. ;
  397. ifndef_open: PPD_IFNDEF
  398. ;
  399. ifdef_identifier: IDENTIFIER { handle_ifdef_open(PPD_IFDEF_INDEX); }
  400. ;
  401. ifndef_identifier: IDENTIFIER { handle_ifndef_open(PPD_IFNDEF_INDEX); }
  402. ;
  403. if_group: if_open new_line group_part_seq_opt
  404. | ifdef_open ifdef_identifier new_line group_part_seq_opt
  405. | ifndef_open ifndef_identifier new_line group_part_seq_opt
  406. | ifdef_open invalid_ifdef_identifier new_line group_part_seq_opt
  407. | ifndef_open invalid_ifndef_identifier new_line group_part_seq_opt
  408. ;
  409. elif_group_seq_opt: /* empty */
  410. | elif_group_seq
  411. ;
  412. elif_group_seq: elif_group
  413. | elif_group_seq elif_group
  414. ;
  415. elif_group_open: PPD_ELIF pp_constant_expression { handle_elif_open(PPD_ELIF_INDEX, $2); }
  416. ;
  417. elif_group: elif_group_open new_line group_part_seq_opt { handle_elif_close(PPD_ELIF_INDEX); }
  418. ;
  419. else_group_opt: /* empty */
  420. | else_group
  421. ;
  422. else_open: PPD_ELSE { handle_else_open(PPD_ELSE_INDEX); }
  423. ;
  424. else_group: else_open new_line group_part_seq_opt
  425. ;
  426. endif_open: PPD_ENDIF { handle_endif(PPD_ENDIF_INDEX); }
  427. ;
  428. endif_line: endif_open new_line
  429. ;
  430. control_line: PPD_INCLUDE preprocessing_token_seq new_line { handle_include(PPD_INCLUDE_INDEX); };
  431. | PPD_DEFINE mo_identifier replacement_list new_line { handle_macro_close (object_macro_index); }
  432. | PPD_DEFINE mf_identifier mf_args replacement_list new_line { handle_macro_close (function_macro_index); }
  433. | PPD_UNDEF mu_identifier new_line
  434. | PPD_LINE { handle_token_open (PPD_LINE_INDEX); } preprocessing_token_seq new_line { handle_token_close (PPD_LINE_INDEX); }
  435. | PPD_ERROR { handle_token_open (PPD_ERROR_INDEX); } preprocessing_token_seq_opt new_line { handle_token_close (PPD_ERROR_INDEX); }
  436. | PPD_PRAGMA { handle_token_open (PPD_PRAGMA_INDEX); } preprocessing_token_seq_opt new_line { handle_token_close (PPD_PRAGMA_INDEX); }
  437. | PPD_NULL new_line
  438. ;
  439. mf_args: BCS_PUNCT_OPEN_PARENTHESIS clean_identifier_list_opt BCS_PUNCT_CLOSE_PARENTHESIS
  440. ;
  441. replacement_list: { handle_replacement_open (replacement_list_index); } preprocessing_token_seq_opt { handle_replacement_close (replacement_list_index); }
  442. ;
  443. preprocessing_token_seq_opt: /* empty */
  444. | preprocessing_token_seq
  445. ;
  446. preprocessing_token_seq: preprocessing_token
  447. | preprocessing_token_seq preprocessing_token
  448. ;
  449. preprocessing_token: header_name
  450. | identifier
  451. | pp_number
  452. | character_literal
  453. | string_literal
  454. | preprocessing_op_or_punc
  455. | BCS_PUNCT_BACKSLASH { handle_token(BCS_PUNCT_BACKSLASH_INDEX); }
  456. ;
  457. header_name: SYSTEM_HEADER_STRING { handle_header_name(SYSTEM_HEADER_STRING_INDEX); }
  458. | HEADER_STRING { handle_header_name(HEADER_STRING_INDEX); }
  459. ;
  460. clean_identifier_list_opt: /* empty */
  461. | clean_identifier_list
  462. ;
  463. clean_identifier_list: identifier
  464. | clean_identifier_list BCS_PUNCT_COMMA identifier
  465. ;
  466. identifier: IDENTIFIER { handle_identifier(IDENTIFIER_INDEX); }
  467. | NON_REPLACEABLE_IDENTIFIER { handle_nonrepl_identifier(IDENTIFIER_INDEX); }
  468. | REPLACED_IDENTIFIER { handle_identifier(REPLACED_IDENTIFIER_INDEX); }
  469. | key_word
  470. ;
  471. pp_identifier: IDENTIFIER
  472. | NON_REPLACEABLE_IDENTIFIER
  473. ;
  474. pp_replaced_identifier_seq_opt: /* empty */
  475. | pp_replaced_identifier_seq
  476. ;
  477. pp_replaced_identifier_seq: pp_replaced_identifier
  478. | pp_replaced_identifier_seq pp_replaced_identifier
  479. ;
  480. pp_replaced_identifier: REPLACED_IDENTIFIER
  481. ;
  482. key_word: kwd_asm
  483. | kwd_auto
  484. | kwd_bool
  485. | kwd_break
  486. | kwd_case
  487. | kwd_catch
  488. | kwd_char
  489. | kwd_class
  490. | kwd_const
  491. | kwd_const_cast
  492. | kwd_continue
  493. | kwd_default
  494. | kwd_do
  495. | kwd_double
  496. | kwd_dynamic_cast
  497. | kwd_else
  498. | kwd_enum
  499. | kwd_explicit
  500. | kwd_export
  501. | kwd_extern
  502. | kwd_float
  503. | kwd_for
  504. | kwd_friend
  505. | kwd_goto
  506. | kwd_if
  507. | kwd_inline
  508. | kwd_int
  509. | kwd_long
  510. | kwd_mutable
  511. | kwd_namespace
  512. | kwd_operator
  513. | kwd_private
  514. | kwd_protected
  515. | kwd_public
  516. | kwd_register
  517. | kwd_reinterpret_cast
  518. | kwd_return
  519. | kwd_short
  520. | kwd_signed
  521. | kwd_static
  522. | kwd_static_cast
  523. | kwd_struct
  524. | kwd_switch
  525. | kwd_template
  526. | kwd_this
  527. | kwd_throw
  528. | kwd_try
  529. | kwd_typedef
  530. | kwd_typename
  531. | kwd_typeid
  532. | kwd_union
  533. | kwd_unsigned
  534. | kwd_using
  535. | kwd_virtual
  536. | kwd_void
  537. | kwd_volatile
  538. | kwd_wchar_t
  539. | kwd_while
  540. ;
  541. pp_number: PP_NUMBER { handle_pp_number(); }
  542. | integer_literal
  543. | floating_literal
  544. ;
  545. integer_literal: INTEGER_LITERAL { handle_string_token(INTEGER_LITERAL_INDEX); }
  546. | octal_literal
  547. | decimal_literal
  548. | hexadecimal_literal
  549. ;
  550. octal_literal: OCTAL_LITERAL { handle_string_token(OCTAL_LITERAL_INDEX); }
  551. ;
  552. decimal_literal: DECIMAL_LITERAL { handle_string_token(DECIMAL_LITERAL_INDEX); }
  553. ;
  554. hexadecimal_literal: HEXADECIMAL_LITERAL { handle_string_token(HEXADECIMAL_LITERAL_INDEX); }
  555. ;
  556. pp_integer_literal: INTEGER_LITERAL { $$ = $1; }
  557. | pp_octal_literal { $$ = $1; }
  558. | pp_decimal_literal { $$ = $1; }
  559. | pp_hexadecimal_literal { $$ = $1; }
  560. ;
  561. pp_octal_literal: OCTAL_LITERAL { $$ = $1; }
  562. ;
  563. pp_decimal_literal: DECIMAL_LITERAL { $$ = $1; }
  564. ;
  565. pp_hexadecimal_literal: HEXADECIMAL_LITERAL { $$ = $1; }
  566. ;
  567. character_literal: CHARACTER_LITERAL { handle_string_token(CHARACTER_LITERAL_INDEX); }
  568. | L_CHARACTER_LITERAL { handle_string_token(L_CHARACTER_LITERAL_INDEX); }
  569. ;
  570. string_literal: STRING_LITERAL { handle_string_token(STRING_LITERAL_INDEX); }
  571. | L_STRING_LITERAL { handle_string_token(L_STRING_LITERAL_INDEX); }
  572. ;
  573. floating_literal: FLOATING_LITERAL { handle_string_token(FLOATING_LITERAL_INDEX); }
  574. ;
  575. pp_boolean_literal: KWD_FALSE { $$ = 0; }
  576. | KWD_TRUE { $$ = 1; }
  577. | BOOLEAN_LITERAL { $$ = $1; }
  578. ;
  579. preprocessing_op_or_punc: bcs_exclamation
  580. | bcs_hash
  581. | op_stringize
  582. | bcs_percent
  583. | bcs_ampersand
  584. | bcs_open_parenthesis
  585. | bcs_close_parenthesis
  586. | bcs_asterisk
  587. | bcs_plus
  588. | bcs_comma
  589. | bcs_minus
  590. | bcs_period
  591. | bcs_slash
  592. | bcs_colon
  593. | bcs_semicolon
  594. | bcs_less_than
  595. | bcs_equal
  596. | bcs_greater_than
  597. | bcs_question
  598. | bcs_open_bracket
  599. | bcs_caret
  600. | bcs_close_bracket
  601. | bcs_open_brace
  602. | bcs_vertical_bar
  603. | bcs_close_brace
  604. | bcs_tilde
  605. | ne
  606. | token_splice
  607. | assign_modulo
  608. | truth_and
  609. | assign_bit_and
  610. | assign_multiply
  611. | increment
  612. | assign_plus
  613. | decrement
  614. | assign_minus
  615. | pointer_member
  616. | pointer_ptm
  617. | object_ptm
  618. | assign_divide
  619. | scope_ref
  620. | shift_left
  621. | assign_shift_left
  622. | le
  623. | eq
  624. | ge
  625. | shift_right
  626. | assign_shift_right
  627. | assign_bit_xor
  628. | assign_bit_or
  629. | truth_or
  630. | var_args
  631. | kwd_new
  632. | kwd_delete
  633. | alt_bit_and
  634. | alt_bit_or
  635. | alt_bit_not
  636. | alt_truth_not
  637. | alt_bit_xor
  638. | kwd_sizeof
  639. ;
  640. pp_constant_expression: pp_expression {$$ = $1;}
  641. ;
  642. pp_expression: pp_conditional_expression {$$ = $1;}
  643. | pp_expression pp_comma_op pp_conditional_expression {$$ = $3;}
  644. ;
  645. pp_conditional_expression: pp_logical_or_expression {$$ = $1;}
  646. | pp_logical_or_expression pp_conditional_operator pp_expression pp_conditional_separator pp_conditional_expression {$$ = ($1) ? $3 : $5;}
  647. ;
  648. pp_logical_or_expression: pp_logical_and_expression {$$ = $1;}
  649. | pp_logical_or_expression pp_truth_or pp_logical_and_expression {$$ = $1 || $3;}
  650. ;
  651. pp_logical_and_expression: pp_inclusive_or_expression {$$ = $1;}
  652. | pp_logical_and_expression pp_truth_and pp_inclusive_or_expression {$$ = $1 && $3;}
  653. ;
  654. pp_inclusive_or_expression: pp_exclusive_or_expression {$$ = $1;}
  655. | pp_inclusive_or_expression pp_bit_or pp_exclusive_or_expression {$$ = $1 | $3;}
  656. ;
  657. pp_exclusive_or_expression: pp_and_expression {$$ = $1;}
  658. | pp_exclusive_or_expression pp_bit_xor pp_and_expression {$$ = $1 ^ $3;}
  659. ;
  660. pp_and_expression: pp_equality_expression {$$ = $1;}
  661. | pp_and_expression pp_bit_and pp_equality_expression {$$ = $1 & $3;}
  662. ;
  663. pp_equality_expression: pp_relational_expression {$$ = $1;}
  664. | pp_equality_expression pp_eq pp_relational_expression {$$ = ($1 == $3);}
  665. | pp_equality_expression pp_ne pp_relational_expression {$$ = ($1 != $3);}
  666. ;
  667. pp_relational_expression: pp_shift_expression {$$ = $1;}
  668. | pp_relational_expression pp_lt pp_shift_expression {$$ = ($1 < $3);}
  669. | pp_relational_expression pp_gt pp_shift_expression {$$ = ($1 > $3);}
  670. | pp_relational_expression pp_le pp_shift_expression {$$ = ($1 <= $3);}
  671. | pp_relational_expression pp_ge pp_shift_expression {$$ = ($1 >= $3);}
  672. ;
  673. pp_shift_expression: pp_additive_expression {$$ = $1;}
  674. | pp_shift_expression pp_shift_left pp_additive_expression {$$ = ($1 << $3);}
  675. | pp_shift_expression pp_shift_right pp_additive_expression {$$ = ($1 >> $3);}
  676. ;
  677. pp_additive_expression: pp_multiplicative_expression {$$ = $1;}
  678. | pp_additive_expression pp_plus pp_multiplicative_expression {$$ = ($1 + $3);}
  679. | pp_additive_expression pp_minus pp_multiplicative_expression {$$ = ($1 - $3);}
  680. ;
  681. pp_multiplicative_expression: pp_unary_expression {$$ = $1;}
  682. | pp_multiplicative_expression pp_multiply pp_unary_expression {$$ = ($1 * $3);}
  683. | pp_multiplicative_expression pp_divide pp_unary_expression {$$ = ($1 / $3);}
  684. | pp_multiplicative_expression pp_modulo pp_unary_expression {$$ = ($1 % $3);}
  685. ;
  686. pp_unary_expression: pp_replaced_identifier_seq_opt pp_primary_expression {$$ = $2;}
  687. | pp_unary_plus pp_unary_expression {$$ = $2;}
  688. | pp_unary_minus pp_unary_expression {$$ = -$2;}
  689. | pp_truth_not pp_unary_expression {$$ = !$2;}
  690. | pp_bit_not pp_unary_expression {$$ = ~$2;}
  691. ;
  692. pp_primary_expression: pp_boolean_literal {$$ = $1;}
  693. | pp_integer_literal {$$ = $1;}
  694. | BCS_PUNCT_OPEN_PARENTHESIS pp_expression BCS_PUNCT_CLOSE_PARENTHESIS {$$ = $2;}
  695. | pp_identifier {$$ = 0;}
  696. ;
  697. kwd_asm: KWD_ASM { handle_token(KWD_ASM_INDEX); }
  698. ;
  699. kwd_auto: KWD_AUTO { handle_token(KWD_AUTO_INDEX); }
  700. ;
  701. kwd_bool: KWD_BOOL { handle_token(KWD_BOOL_INDEX); }
  702. ;
  703. kwd_break: KWD_BREAK { handle_token(KWD_BREAK_INDEX); }
  704. ;
  705. kwd_case: KWD_CASE { handle_token(KWD_CASE_INDEX); }
  706. ;
  707. kwd_catch: KWD_CATCH { handle_token(KWD_CATCH_INDEX); }
  708. ;
  709. kwd_char: KWD_CHAR { handle_token(KWD_CHAR_INDEX); }
  710. ;
  711. kwd_class: KWD_CLASS { handle_token(KWD_CLASS_INDEX); }
  712. ;
  713. kwd_const: KWD_CONST { handle_token(KWD_CONST_INDEX); }
  714. ;
  715. kwd_const_cast: KWD_CONST_CAST { handle_token(KWD_CONST_CAST_INDEX); }
  716. ;
  717. kwd_continue: KWD_CONTINUE { handle_token(KWD_CONTINUE_INDEX); }
  718. ;
  719. kwd_default: KWD_DEFAULT { handle_token(KWD_DEFAULT_INDEX); }
  720. ;
  721. kwd_delete: KWD_DELETE { handle_token(KWD_DELETE_INDEX); }
  722. ;
  723. kwd_do: KWD_DO { handle_token(KWD_DO_INDEX); }
  724. ;
  725. kwd_double: KWD_DOUBLE { handle_token(KWD_DOUBLE_INDEX); }
  726. ;
  727. kwd_dynamic_cast: KWD_DYNAMIC_CAST { handle_token(KWD_DYNAMIC_CAST_INDEX); }
  728. ;
  729. kwd_else: KWD_ELSE { handle_token(KWD_ELSE_INDEX); }
  730. ;
  731. kwd_enum: KWD_ENUM { handle_token(KWD_ENUM_INDEX); }
  732. ;
  733. kwd_explicit: KWD_EXPLICIT { handle_token(KWD_EXPLICIT_INDEX); }
  734. ;
  735. kwd_export: KWD_EXPORT { handle_token(KWD_EXPORT_INDEX); }
  736. ;
  737. kwd_extern: KWD_EXTERN { handle_token(KWD_EXTERN_INDEX); }
  738. ;
  739. kwd_float: KWD_FLOAT { handle_token(KWD_FLOAT_INDEX); }
  740. ;
  741. kwd_for: KWD_FOR { handle_token(KWD_FOR_INDEX); }
  742. ;
  743. kwd_friend: KWD_FRIEND { handle_token(KWD_FRIEND_INDEX); }
  744. ;
  745. kwd_goto: KWD_GOTO { handle_token(KWD_GOTO_INDEX); }
  746. ;
  747. kwd_if: KWD_IF { handle_token(KWD_IF_INDEX); }
  748. ;
  749. kwd_inline: KWD_INLINE { handle_token(KWD_INLINE_INDEX); }
  750. ;
  751. kwd_int: KWD_INT { handle_token(KWD_INT_INDEX); }
  752. ;
  753. kwd_long: KWD_LONG { handle_token(KWD_LONG_INDEX); }
  754. ;
  755. kwd_mutable: KWD_MUTABLE { handle_token(KWD_MUTABLE_INDEX); }
  756. ;
  757. kwd_namespace: KWD_NAMESPACE { handle_token(KWD_NAMESPACE_INDEX); }
  758. ;
  759. kwd_new: KWD_NEW { handle_token(KWD_NEW_INDEX); }
  760. ;
  761. kwd_operator: KWD_OPERATOR { handle_token(KWD_OPERATOR_INDEX); }
  762. ;
  763. kwd_private: KWD_PRIVATE { handle_token(KWD_PRIVATE_INDEX); }
  764. ;
  765. kwd_protected: KWD_PROTECTED { handle_token(KWD_PROTECTED_INDEX); }
  766. ;
  767. kwd_public: KWD_PUBLIC { handle_token(KWD_PUBLIC_INDEX); }
  768. ;
  769. kwd_register: KWD_REGISTER { handle_token(KWD_REGISTER_INDEX); }
  770. ;
  771. kwd_reinterpret_cast: KWD_REINTERPRET_CAST { handle_token(KWD_REINTERPRET_CAST_INDEX); }
  772. ;
  773. kwd_return: KWD_RETURN { handle_token(KWD_RETURN_INDEX); }
  774. ;
  775. kwd_short: KWD_SHORT { handle_token(KWD_SHORT_INDEX); }
  776. ;
  777. kwd_signed: KWD_SIGNED { handle_token(KWD_SIGNED_INDEX); }
  778. ;
  779. kwd_sizeof: KWD_SIZEOF { handle_token(KWD_SIZEOF_INDEX); }
  780. ;
  781. kwd_static: KWD_STATIC { handle_token(KWD_STATIC_INDEX); }
  782. ;
  783. kwd_static_cast: KWD_STATIC_CAST { handle_token(KWD_STATIC_CAST_INDEX); }
  784. ;
  785. kwd_struct: KWD_STRUCT { handle_token(KWD_STRUCT_INDEX); }
  786. ;
  787. kwd_switch: KWD_SWITCH { handle_token(KWD_SWITCH_INDEX); }
  788. ;
  789. kwd_template: KWD_TEMPLATE { handle_token(KWD_TEMPLATE_INDEX); }
  790. ;
  791. kwd_this: KWD_THIS { handle_token(KWD_THIS_INDEX); }
  792. ;
  793. kwd_throw: KWD_THROW { handle_token(KWD_THROW_INDEX); }
  794. ;
  795. kwd_try: KWD_TRY { handle_token(KWD_TRY_INDEX); }
  796. ;
  797. kwd_typedef: KWD_TYPEDEF { handle_token(KWD_TYPEDEF_INDEX); }
  798. ;
  799. kwd_typename: KWD_TYPENAME { handle_token(KWD_TYPENAME_INDEX); }
  800. ;
  801. kwd_typeid: KWD_TYPEID { handle_token(KWD_TYPEID_INDEX); }
  802. ;
  803. kwd_union: KWD_UNION { handle_token(KWD_UNION_INDEX); }
  804. ;
  805. kwd_unsigned: KWD_UNSIGNED { handle_token(KWD_UNSIGNED_INDEX); }
  806. ;
  807. kwd_using: KWD_USING { handle_token(KWD_USING_INDEX); }
  808. ;
  809. kwd_virtual: KWD_VIRTUAL { handle_token(KWD_VIRTUAL_INDEX); }
  810. ;
  811. kwd_void: KWD_VOID { handle_token(KWD_VOID_INDEX); }
  812. ;
  813. kwd_volatile: KWD_VOLATILE { handle_token(KWD_VOLATILE_INDEX); }
  814. ;
  815. kwd_wchar_t: KWD_WCHAR_T { handle_token(KWD_WCHAR_T_INDEX); }
  816. ;
  817. kwd_while: KWD_WHILE { handle_token(KWD_WHILE_INDEX); }
  818. ;
  819. new_line: BCS_WHTSP_NEWLINE
  820. ;
  821. bcs_hash: BCS_PUNCT_HASH { handle_token(BCS_PUNCT_HASH_INDEX); }
  822. | ALT_PUNCT_HASH { handle_token(ALT_PUNCT_HASH_INDEX); }
  823. ;
  824. op_stringize: OP_STRINGIZE { handle_token(OP_STRINGIZE_INDEX); }
  825. ;
  826. token_splice: OP_TOKEN_SPLICE { handle_token(OP_TOKEN_SPLICE_INDEX); }
  827. | ALT_OP_TOKEN_SPLICE { handle_token(ALT_OP_TOKEN_SPLICE_INDEX); }
  828. ;
  829. mf_identifier: MACRO_FUNCTION_IDENTIFIER { handle_macro_open(function_macro_index /*MACRO_FUNCTION_IDENTIFIER_INDEX*/); }
  830. | INV_MFI_LOGICAL_AND { handle_invalid_macro_id(OP_ALT_LOGICAL_AND_INDEX); }
  831. | INV_MFI_ASSIGN_BIT_AND { handle_invalid_macro_id(OP_ALT_ASSIGN_BIT_AND_INDEX); }
  832. | INV_MFI_BIT_AND { handle_invalid_macro_id(OP_ALT_BIT_AND_INDEX); }
  833. | INV_MFI_BIT_OR { handle_invalid_macro_id(OP_ALT_BIT_OR_INDEX); }
  834. | INV_MFI_BIT_NOT { handle_invalid_macro_id(OP_ALT_BIT_NOT_INDEX); }
  835. | INV_MFI_LOGICAL_NOT { handle_invalid_macro_id(OP_ALT_LOGICAL_NOT_INDEX); }
  836. | INV_MFI_NE { handle_invalid_macro_id(OP_ALT_NE_INDEX); }
  837. | INV_MFI_LOGICAL_OR { handle_invalid_macro_id(OP_ALT_LOGICAL_OR_INDEX); }
  838. | INV_MFI_ASSIGN_BIT_OR { handle_invalid_macro_id(OP_ALT_ASSIGN_BIT_OR_INDEX); }
  839. | INV_MFI_BIT_PLUS { handle_invalid_macro_id(OP_ALT_BIT_PLUS_INDEX); }
  840. | INV_MFI_ASSIGN_BIT_PLUS { handle_invalid_macro_id(OP_ALT_ASSIGN_BIT_PLUS_INDEX); }
  841. ;
  842. mo_identifier: MACRO_OBJECT_IDENTIFIER { handle_macro_open(object_macro_index/*MACRO_OBJECT_IDENTIFIER_INDEX*/); }
  843. | invalid_macro_identifier
  844. ;
  845. mu_identifier: IDENTIFIER { handle_macro_undef(PPD_UNDEF_INDEX); }
  846. | invalid_macro_identifier { pop(); }
  847. ;
  848. invalid_ifdef_identifier: invalid_macro_identifier
  849. ;
  850. invalid_ifndef_identifier: invalid_macro_identifier
  851. ;
  852. invalid_macro_identifier: INV_ALT_LOGICAL_AND { handle_invalid_macro_id(OP_ALT_LOGICAL_AND_INDEX); }
  853. | INV_ALT_ASSIGN_BIT_AND { handle_invalid_macro_id(OP_ALT_ASSIGN_BIT_AND_INDEX); }
  854. | INV_ALT_BIT_AND { handle_invalid_macro_id(OP_ALT_BIT_AND_INDEX); }
  855. | INV_ALT_BIT_OR { handle_invalid_macro_id(OP_ALT_BIT_OR_INDEX); }
  856. | INV_ALT_BIT_NOT { handle_invalid_macro_id(OP_ALT_BIT_NOT_INDEX); }
  857. | INV_ALT_LOGICAL_NOT { handle_invalid_macro_id(OP_ALT_LOGICAL_NOT_INDEX); }
  858. | INV_ALT_NE { handle_invalid_macro_id(OP_ALT_NE_INDEX); }
  859. | INV_ALT_LOGICAL_OR { handle_invalid_macro_id(OP_ALT_LOGICAL_OR_INDEX); }
  860. | INV_ALT_ASSIGN_BIT_OR { handle_invalid_macro_id(OP_ALT_ASSIGN_BIT_OR_INDEX); }
  861. | INV_ALT_BIT_PLUS { handle_invalid_macro_id(OP_ALT_BIT_PLUS_INDEX); }
  862. | INV_ALT_ASSIGN_BIT_PLUS { handle_invalid_macro_id(OP_ALT_ASSIGN_BIT_PLUS_INDEX); }
  863. ;
  864. bcs_exclamation: BCS_PUNCT_EXCLAMATION { handle_token(OP_LOGICAL_NOT_INDEX); }
  865. ;
  866. alt_truth_not: OP_ALT_LOGICAL_NOT { handle_token(OP_ALT_LOGICAL_NOT_INDEX); }
  867. ;
  868. pp_truth_not: BCS_PUNCT_EXCLAMATION
  869. | OP_ALT_LOGICAL_NOT
  870. ;
  871. ne: OP_NE { handle_token(OP_NE_INDEX); }
  872. | OP_ALT_NE { handle_token(OP_ALT_NE_INDEX); }
  873. ;
  874. pp_ne: OP_NE
  875. | OP_ALT_NE
  876. ;
  877. bcs_percent: modulo
  878. ;
  879. modulo: BCS_PUNCT_PERCENT { handle_token(OP_MODULO_INDEX); }
  880. ;
  881. pp_modulo: BCS_PUNCT_PERCENT
  882. ;
  883. assign_modulo: OP_ASSIGN_MODULO { handle_token(OP_ASSIGN_MODULO_INDEX); }
  884. ;
  885. bcs_ampersand: BCS_PUNCT_AMPERSAND { handle_token(BCS_PUNCT_AMPERSAND_INDEX); }
  886. ;
  887. alt_bit_and: OP_ALT_BIT_AND { handle_token(OP_ALT_BIT_AND_INDEX); }
  888. ;
  889. pp_bit_and: BCS_PUNCT_AMPERSAND
  890. | OP_ALT_BIT_AND
  891. ;
  892. truth_and: OP_LOGICAL_AND { handle_token(OP_LOGICAL_AND_INDEX); }
  893. | OP_ALT_LOGICAL_AND { handle_token(OP_ALT_LOGICAL_AND_INDEX); }
  894. ;
  895. pp_truth_and: OP_LOGICAL_AND
  896. | OP_ALT_LOGICAL_AND
  897. ;
  898. assign_bit_and: OP_ASSIGN_BIT_AND { handle_token(OP_ASSIGN_BIT_AND_INDEX); }
  899. | OP_ALT_ASSIGN_BIT_AND { handle_token(OP_ALT_ASSIGN_BIT_AND_INDEX); }
  900. ;
  901. bcs_open_parenthesis: BCS_PUNCT_OPEN_PARENTHESIS { handle_token_open(BCS_PUNCT_OPEN_PARENTHESIS_INDEX); }
  902. ;
  903. bcs_close_parenthesis: BCS_PUNCT_CLOSE_PARENTHESIS { handle_token_close(BCS_PUNCT_CLOSE_PARENTHESIS_INDEX); }
  904. ;
  905. bcs_asterisk: BCS_PUNCT_ASTERISK { handle_token(BCS_PUNCT_ASTERISK_INDEX); }
  906. ;
  907. pp_multiply: BCS_PUNCT_ASTERISK
  908. ;
  909. assign_multiply: OP_ASSIGN_MULTIPLY { handle_token(OP_ASSIGN_MULTIPLY_INDEX); }
  910. ;
  911. bcs_plus: BCS_PUNCT_PLUS { handle_token(BCS_PUNCT_PLUS_INDEX); }
  912. ;
  913. pp_plus: BCS_PUNCT_PLUS
  914. ;
  915. pp_unary_plus: BCS_PUNCT_PLUS
  916. ;
  917. increment: OP_INCREMENT { handle_token(OP_INCREMENT_INDEX); }
  918. ;
  919. assign_plus: OP_ASSIGN_PLUS { handle_token(OP_ASSIGN_PLUS_INDEX); }
  920. ;
  921. bcs_comma: BCS_PUNCT_COMMA { handle_token(BCS_PUNCT_COMMA_INDEX); }
  922. ;
  923. pp_comma_op: BCS_PUNCT_COMMA
  924. ;
  925. bcs_minus: BCS_PUNCT_MINUS { handle_token(BCS_PUNCT_MINUS_INDEX); }
  926. ;
  927. pp_minus: BCS_PUNCT_MINUS
  928. ;
  929. pp_unary_minus: BCS_PUNCT_MINUS
  930. ;
  931. decrement: OP_DECREMENT { handle_token(OP_DECREMENT_INDEX); }
  932. ;
  933. assign_minus: OP_ASSIGN_MINUS { handle_token(OP_ASSIGN_MINUS_INDEX); }
  934. ;
  935. pointer_member: OP_POINTER_MEMBER { handle_token(OP_POINTER_MEMBER_INDEX); }
  936. ;
  937. pointer_ptm: OP_POINTER_POINTER_TO_MEMBER { handle_token(OP_POINTER_POINTER_TO_MEMBER_INDEX); }
  938. ;
  939. bcs_period: BCS_PUNCT_PERIOD { handle_token(BCS_PUNCT_PERIOD_INDEX); }
  940. ;
  941. var_args: DECL_VAR_ARGS { handle_token(DECL_VAR_ARGS_INDEX); }
  942. ;
  943. object_ptm: OP_OBJECT_POINTER_TO_MEMBER { handle_token(OP_OBJECT_POINTER_TO_MEMBER_INDEX); }
  944. ;
  945. bcs_slash: divide
  946. ;
  947. divide: BCS_PUNCT_SLASH { handle_token(OP_DIVIDE_INDEX); }
  948. ;
  949. pp_divide: BCS_PUNCT_SLASH
  950. ;
  951. assign_divide: OP_ASSIGN_DIVIDE { handle_token(OP_ASSIGN_DIVIDE_INDEX); }
  952. ;
  953. bcs_colon: BCS_PUNCT_COLON { handle_token(BCS_PUNCT_COLON_INDEX); }
  954. ;
  955. pp_conditional_separator: BCS_PUNCT_COLON
  956. ;
  957. scope_ref: OP_SCOPE_REF { handle_token(OP_SCOPE_REF_INDEX); }
  958. ;
  959. bcs_semicolon: BCS_PUNCT_SEMICOLON { handle_token(BCS_PUNCT_SEMICOLON_INDEX); }
  960. ;
  961. bcs_less_than: BCS_PUNCT_LESS_THAN { handle_token(BCS_PUNCT_LESS_THAN_INDEX); }
  962. ;
  963. pp_lt: BCS_PUNCT_LESS_THAN
  964. ;
  965. shift_left: OP_SHIFT_LEFT { handle_token(OP_SHIFT_LEFT_INDEX); }
  966. ;
  967. pp_shift_left: OP_SHIFT_LEFT
  968. ;
  969. assign_shift_left: OP_ASSIGN_SHIFT_LEFT { handle_token(OP_ASSIGN_SHIFT_LEFT_INDEX); }
  970. ;
  971. le: OP_LE { handle_token(OP_LE_INDEX); }
  972. ;
  973. pp_le: OP_LE
  974. ;
  975. bcs_equal: BCS_PUNCT_EQUAL { handle_token(BCS_PUNCT_EQUAL_INDEX); }
  976. ;
  977. eq: OP_EQ { handle_token(OP_EQ_INDEX); }
  978. ;
  979. pp_eq: OP_EQ
  980. ;
  981. bcs_greater_than: BCS_PUNCT_GREATER_THAN { handle_token(BCS_PUNCT_GREATER_THAN_INDEX); }
  982. ;
  983. pp_gt: BCS_PUNCT_GREATER_THAN
  984. ;
  985. ge: OP_GE { handle_token(OP_GE_INDEX); }
  986. ;
  987. pp_ge: OP_GE
  988. ;
  989. shift_right: OP_SHIFT_RIGHT { handle_token(OP_SHIFT_RIGHT_INDEX); }
  990. ;
  991. pp_shift_right: OP_SHIFT_RIGHT { handle_token(OP_SHIFT_RIGHT_INDEX); }
  992. ;
  993. assign_shift_right: OP_ASSIGN_SHIFT_RIGHT { handle_token(OP_ASSIGN_SHIFT_RIGHT_INDEX); }
  994. ;
  995. bcs_question: conditional_operator
  996. conditional_operator: OP_CONDITIONAL { handle_token(OP_CONDITIONAL_INDEX); }
  997. ;
  998. pp_conditional_operator: OP_CONDITIONAL
  999. ;
  1000. bcs_open_bracket: BCS_PUNCT_OPEN_BRACKET { handle_token_open(BCS_PUNCT_OPEN_BRACKET_INDEX); }
  1001. | ALT_PUNCT_OPEN_BRACKET { handle_token_open(ALT_PUNCT_OPEN_BRACKET_INDEX); }
  1002. ;
  1003. bcs_close_bracket: BCS_PUNCT_CLOSE_BRACKET { handle_token_close(BCS_PUNCT_CLOSE_BRACKET_INDEX); }
  1004. | ALT_PUNCT_CLOSE_BRACKET { handle_token_close(ALT_PUNCT_CLOSE_BRACKET_INDEX); }
  1005. ;
  1006. bcs_caret: BCS_PUNCT_CARET { handle_token(OP_BIT_PLUS_INDEX); }
  1007. ;
  1008. alt_bit_xor: OP_ALT_BIT_PLUS { handle_token(OP_ALT_BIT_PLUS_INDEX); }
  1009. ;
  1010. pp_bit_xor: BCS_PUNCT_CARET
  1011. | OP_ALT_BIT_PLUS
  1012. ;
  1013. assign_bit_xor: OP_ASSIGN_BIT_PLUS { handle_token(OP_ASSIGN_BIT_PLUS_INDEX); }
  1014. | OP_ALT_ASSIGN_BIT_PLUS { handle_token(OP_ALT_ASSIGN_BIT_PLUS_INDEX); }
  1015. ;
  1016. bcs_open_brace: BCS_PUNCT_OPEN_BRACE { handle_token_open(BCS_PUNCT_OPEN_BRACE_INDEX); }
  1017. | ALT_PUNCT_OPEN_BRACE { handle_token_open(ALT_PUNCT_OPEN_BRACE_INDEX); }
  1018. ;
  1019. bcs_close_brace: BCS_PUNCT_CLOSE_BRACE { handle_token_close(BCS_PUNCT_CLOSE_BRACE_INDEX); }
  1020. | ALT_PUNCT_CLOSE_BRACE { handle_token_close(ALT_PUNCT_CLOSE_BRACE_INDEX); }
  1021. ;
  1022. bcs_vertical_bar: BCS_PUNCT_VERTICAL_BAR { handle_token(OP_BIT_OR_INDEX); }
  1023. ;
  1024. alt_bit_or: OP_ALT_BIT_OR { handle_token(OP_BIT_OR_INDEX); }
  1025. ;
  1026. pp_bit_or: BCS_PUNCT_VERTICAL_BAR
  1027. | OP_ALT_BIT_OR
  1028. ;
  1029. assign_bit_or: OP_ASSIGN_BIT_OR { handle_token(OP_ASSIGN_BIT_OR_INDEX); }
  1030. | OP_ALT_ASSIGN_BIT_OR { handle_token(OP_ALT_ASSIGN_BIT_OR_INDEX); }
  1031. ;
  1032. truth_or: OP_LOGICAL_OR { handle_token(OP_LOGICAL_OR_INDEX); }
  1033. | OP_ALT_LOGICAL_OR { handle_token(OP_ALT_LOGICAL_OR_INDEX); }
  1034. ;
  1035. pp_truth_or: OP_LOGICAL_OR
  1036. | OP_ALT_LOGICAL_OR
  1037. ;
  1038. bcs_tilde: BCS_PUNCT_TILDE { handle_token(OP_BIT_NOT_INDEX); }
  1039. ;
  1040. alt_bit_not: OP_ALT_BIT_NOT { handle_token(OP_ALT_BIT_NOT_INDEX); }
  1041. ;
  1042. pp_bit_not: BCS_PUNCT_TILDE
  1043. | OP_ALT_BIT_NOT
  1044. ;
  1045. %%
  1046. /*
  1047. *
  1048. */
  1049. const char *get_yytname(int token) {
  1050. return yytname[yytranslate[token]];
  1051. }
  1052. /*
  1053. *
  1054. */
  1055. void yyerror(char const *s) {
  1056. extern int error_count;
  1057. extern int yychar;
  1058. fprintf(stderr, "%s\n", s);
  1059. if (yychar > 126) {
  1060. fprintf(stderr, "File %s; line %d: yychar = %s(%d)\n",getCurrentFilename(), getCurrentLineNumber(), get_yytname(yychar), yychar);
  1061. } else {
  1062. fprintf(stderr, "File %s; line %d: yychar = %c\n",getCurrentFilename(),getCurrentLineNumber(), yychar);
  1063. }
  1064. error_count++;
  1065. }