h2pas.y 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945
  1. %{
  2. unit h2pparse;
  3. interface
  4. uses
  5. scan, h2pconst, h2plexlib, h2pyacclib, scanbase, h2pbase, h2ptypes,h2pout;
  6. procedure EnableDebug;
  7. function yyparse : integer;
  8. Implementation
  9. procedure EnableDebug;
  10. begin
  11. yydebug:=true;
  12. end;
  13. %}
  14. %token _WHILE _FOR _DO _GOTO _CONTINUE _BREAK
  15. %token TYPEDEF DEFINE
  16. %token COLON SEMICOLON COMMA
  17. %token LKLAMMER RKLAMMER LECKKLAMMER RECKKLAMMER
  18. %token LGKLAMMER RGKLAMMER
  19. %token STRUCT UNION ENUM
  20. %token ID NUMBER CSTRING
  21. %token SHORT UNSIGNED LONG INT FLOAT _CHAR
  22. %token VOID _CONST
  23. %token _FAR _HUGE _NEAR
  24. %token NEW_LINE SPACE_DEFINE
  25. %token EXTERN STDCALL CDECL CALLBACK PASCAL WINAPI APIENTRY WINGDIAPI SYS_TRAP
  26. %token _PACKED
  27. %token ELLIPSIS
  28. %right _ASSIGN
  29. %right R_AND
  30. %left EQUAL UNEQUAL GT LT GTE LTE
  31. %left QUESTIONMARK COLON
  32. %left _OR
  33. %left _AND
  34. %left _PLUS MINUS
  35. %left _SHR _SHL
  36. %left STAR _SLASH
  37. %right _NOT
  38. %right LKLAMMER
  39. %right PSTAR
  40. %right P_AND
  41. %right LECKKLAMMER
  42. %left POINT DEREF
  43. %left COMMA
  44. %left STICK
  45. %token SIGNED
  46. %token INT8 INT16 INT32 INT64
  47. %%
  48. file : declaration_list
  49. ;
  50. maybe_space :
  51. SPACE_DEFINE
  52. {
  53. (* SPACE_DEFINE *)
  54. $$:=nil;
  55. } |
  56. {
  57. (* empty space *)
  58. $$:=nil;
  59. }
  60. ;
  61. error_info : {
  62. (* error_info *)
  63. EmitErrorStart(yyline);
  64. };
  65. declaration_list : declaration_list declaration
  66. {
  67. (* declaration_list declaration *)
  68. EmitAndOutput('declaration reduced at line ',line_no);
  69. }
  70. | declaration_list define_dec
  71. {
  72. (* declaration_list define_dec *)
  73. EmitAndOutput('define declaration reduced at line ',line_no);
  74. }
  75. | declaration
  76. {
  77. (* declaration *)
  78. EmitAndOutput('define declaration reduced at line ',line_no);
  79. }
  80. | define_dec
  81. {
  82. (* define_dec *)
  83. EmitAndOutput('define declaration reduced at line ',line_no);
  84. }
  85. ;
  86. dec_specifier :
  87. EXTERN
  88. { (* EXTERN *)
  89. $$:=NewID('extern');
  90. }
  91. |
  92. { (* not extern *)
  93. $$:=NewID('intern');
  94. }
  95. ;
  96. dec_modifier :
  97. STDCALL
  98. {
  99. (* STDCALL *)
  100. $$:=NewID('no_pop');
  101. }
  102. | CDECL
  103. {
  104. (* CDECL *)
  105. $$:=NewID('cdecl');
  106. }
  107. | CALLBACK
  108. {
  109. (* CALLBACK *)
  110. $$:=NewID('no_pop');
  111. }
  112. | PASCAL
  113. {
  114. (* PASCAL *)
  115. $$:=NewID('no_pop');
  116. }
  117. | WINAPI
  118. {
  119. (* WINAPI *)
  120. $$:=NewID('no_pop');
  121. }
  122. | APIENTRY
  123. {
  124. (* APIENTRY *)
  125. $$:=NewID('no_pop');
  126. }
  127. | WINGDIAPI
  128. {
  129. (* WINGDIAPI *)
  130. $$:=NewID('no_pop');
  131. }
  132. |
  133. {
  134. (* No modifier *)
  135. $$:=nil
  136. }
  137. ;
  138. systrap_specifier:
  139. SYS_TRAP LKLAMMER dname RKLAMMER
  140. {
  141. (* SYS_TRAP LKLAMMER dname RKLAMMER *)
  142. $$:=$3;
  143. }
  144. |
  145. {
  146. (* Empty systrap *)
  147. $$:=nil;
  148. }
  149. ;
  150. statement :
  151. expr SEMICOLON
  152. {
  153. (* expr SEMICOLON *)
  154. $$:=$1;
  155. } |
  156. _WHILE LKLAMMER expr RKLAMMER statement_list
  157. {
  158. (* _WHILE LKLAMMER expr RKLAMMER statement_list *)
  159. $$:=NewType2(t_whilenode,$3,$5);
  160. }
  161. ;
  162. statement_list : statement statement_list
  163. {
  164. (* statement statement_list *)
  165. $$:=NewType1(t_statement_list,$1);
  166. $$^.next:=$2;
  167. } |
  168. statement
  169. {
  170. (* statement *)
  171. $$:=NewType1(t_statement_list,$1);
  172. } |
  173. SEMICOLON
  174. {
  175. (* SEMICOLON *)
  176. $$:=NewType1(t_statement_list,nil);
  177. } |
  178. {
  179. (* empty statement *)
  180. $$:=NewType1(t_statement_list,nil);
  181. }
  182. ;
  183. statement_block :
  184. LGKLAMMER statement_list RGKLAMMER
  185. {
  186. (* LGKLAMMER statement_list RGKLAMMER *)
  187. $$:=$2;
  188. }
  189. ;
  190. declaration :
  191. dec_specifier type_specifier dec_modifier declarator_list statement_block
  192. {
  193. (* dec_specifier type_specifier dec_modifier declarator_list statement_block *)
  194. HandleDeclarationStatement($1,$2,$3,$4,$5);
  195. }
  196. | dec_specifier type_specifier dec_modifier declarator_list systrap_specifier SEMICOLON
  197. {
  198. (* dec_specifier type_specifier dec_modifier declarator_list systrap_specifier SEMICOLON *)
  199. HandleDeclarationSysTrap($1,$2,$3,$4,$5);
  200. } |
  201. special_type_specifier SEMICOLON
  202. {
  203. (* special_type_specifier SEMICOLON *)
  204. HandleSpecialType($1);
  205. } |
  206. TYPEDEF STRUCT dname dname SEMICOLON
  207. {
  208. (* TYPEDEF STRUCT dname dname SEMICOLON *)
  209. HandleStructDef($3,$4);
  210. } |
  211. TYPEDEF type_specifier LKLAMMER dec_modifier declarator RKLAMMER maybe_space LKLAMMER argument_declaration_list RKLAMMER SEMICOLON
  212. {
  213. (* TYPEDEF type_specifier LKLAMMER dec_modifier declarator RKLAMMER maybe_space LKLAMMER argument_declaration_list RKLAMMER SEMICOLON *)
  214. HandleTypeDef($2,$4,$5,$9);
  215. } |
  216. TYPEDEF type_specifier dec_modifier declarator_list SEMICOLON
  217. {
  218. (* TYPEDEF type_specifier dec_modifier declarator_list SEMICOLON *)
  219. HandleTypeDefList($2,$3,$4);
  220. } |
  221. TYPEDEF dname SEMICOLON
  222. {
  223. (* TYPEDEF dname SEMICOLON *)
  224. HandleSimpleTypeDef($2);
  225. }
  226. | error error_info SEMICOLON
  227. {
  228. (* error error_info SEMICOLON *)
  229. HandleErrorDecl($1,$2);
  230. }
  231. ;
  232. define_dec :
  233. DEFINE dname LKLAMMER enum_list RKLAMMER para_def_expr NEW_LINE
  234. {
  235. (* DEFINE dname LKLAMMER enum_list RKLAMMER para_def_expr NEW_LINE *)
  236. HandleDefineMacro($2,$4,$6);
  237. }|
  238. DEFINE dname SPACE_DEFINE NEW_LINE
  239. {
  240. (* DEFINE dname SPACE_DEFINE NEW_LINE *)
  241. HandleDefine($2);
  242. }|
  243. DEFINE dname NEW_LINE
  244. {
  245. (* DEFINE dname NEW_LINE *)
  246. HandleDefine($2);
  247. } |
  248. DEFINE dname SPACE_DEFINE def_expr NEW_LINE
  249. {
  250. (* DEFINE dname SPACE_DEFINE def_expr NEW_LINE *)
  251. HandleDefineConst($2,$4);
  252. }
  253. | error error_info NEW_LINE
  254. {
  255. (* error error_info NEW_LINE *)
  256. HandleErrorDecl($1,$2);
  257. }
  258. ;
  259. closed_list :
  260. LGKLAMMER member_list RGKLAMMER
  261. {
  262. (* LGKLAMMER member_list RGKLAMMER *)
  263. $$:=$2;
  264. }
  265. | error error_info RGKLAMMER
  266. {
  267. (* error error_info RGKLAMMER *)
  268. emitwriteln(' in member_list *)');
  269. yyerrok;
  270. $$:=nil;
  271. }
  272. ;
  273. closed_enum_list :
  274. LGKLAMMER enum_list RGKLAMMER
  275. {
  276. (* LGKLAMMER enum_list RGKLAMMER *)
  277. $$:=$2;
  278. }
  279. | error error_info RGKLAMMER
  280. {
  281. (* error error_info RGKLAMMER *)
  282. emitwriteln(' in enum_list *)');
  283. yyerrok;
  284. $$:=nil;
  285. }
  286. ;
  287. special_type_specifier :
  288. STRUCT dname closed_list _PACKED
  289. {
  290. (* STRUCT dname closed_list _PACKED *)
  291. emitpacked(1);
  292. $$:=NewType2(t_structdef,$3,$2);
  293. } |
  294. STRUCT dname closed_list
  295. {
  296. (* STRUCT dname closed_list *)
  297. emitpacked(4);
  298. $$:=NewType2(t_structdef,$3,$2);
  299. } |
  300. UNION dname closed_list _PACKED
  301. {
  302. (* UNION dname closed_list _PACKED *)
  303. emitpacked(1);
  304. $$:=NewType2(t_uniondef,$3,$2);
  305. } |
  306. UNION dname closed_list
  307. {
  308. (* UNION dname closed_list *)
  309. $$:=NewType2(t_uniondef,$3,$2);
  310. } |
  311. UNION dname
  312. {
  313. (* UNION dname *)
  314. $$:=$2;
  315. } |
  316. STRUCT dname
  317. {
  318. (* STRUCT dname *)
  319. $$:=$2;
  320. } |
  321. ENUM dname closed_enum_list
  322. {
  323. (* ENUM dname closed_enum_list *)
  324. $$:=NewType2(t_enumdef,$3,$2);
  325. } |
  326. ENUM dname
  327. {
  328. (* ENUM dname *)
  329. $$:=$2;
  330. };
  331. type_specifier :
  332. _CONST type_specifier
  333. {
  334. (* _CONST type_specifier *)
  335. EmitIgnoreConst;
  336. $$:=$2;
  337. } |
  338. UNION closed_list _PACKED
  339. {
  340. (* UNION closed_list _PACKED *)
  341. EmitPacked(1);
  342. $$:=NewType1(t_uniondef,$2);
  343. } |
  344. UNION closed_list
  345. {
  346. (* UNION closed_list *)
  347. $$:=NewType1(t_uniondef,$2);
  348. } |
  349. STRUCT closed_list _PACKED
  350. {
  351. (* STRUCT closed_list _PACKED *)
  352. emitpacked(1);
  353. $$:=NewType1(t_structdef,$2);
  354. } |
  355. STRUCT closed_list
  356. {
  357. (* STRUCT closed_list *)
  358. emitpacked(4);
  359. $$:=NewType1(t_structdef,$2);
  360. } |
  361. ENUM closed_enum_list
  362. {
  363. (* ENUM closed_enum_list*)
  364. $$:=NewType1(t_enumdef,$2);
  365. } |
  366. special_type_specifier
  367. {
  368. (* special_type_specifier *)
  369. $$:=$1;
  370. } |
  371. simple_type_name { $$:=$1; }
  372. ;
  373. member_list : member_declaration member_list
  374. {
  375. (* member_declaration member_list *)
  376. $$:=NewType1(t_memberdeclist,$1);
  377. $$^.next:=$2;
  378. } |
  379. member_declaration
  380. {
  381. (* member_declaration *)
  382. $$:=NewType1(t_memberdeclist,$1);
  383. }
  384. ;
  385. member_declaration :
  386. type_specifier declarator_list SEMICOLON
  387. {
  388. (* type_specifier declarator_list SEMICOLON *)
  389. $$:=NewType2(t_memberdec,$1,$2);
  390. }
  391. ;
  392. dname : ID {
  393. (* dname *)
  394. $$:=NewID(act_token);
  395. }
  396. ;
  397. special_type_name :
  398. SIGNED special_type_name
  399. {
  400. (* SIGNED special_type_name *)
  401. $$:=HandleSpecialSignedType($2);
  402. } |
  403. UNSIGNED special_type_name
  404. {
  405. (* UNSIGNED special_type_name *)
  406. $$:=HandleSpecialUnsignedType($2);
  407. } |
  408. INT
  409. {
  410. (* INT *)
  411. $$:=NewCType(cint_STR,INT_STR);
  412. } |
  413. LONG
  414. {
  415. (* LONG *)
  416. $$:=NewCType(clong_STR,INT_STR);
  417. } |
  418. LONG INT
  419. {
  420. (* LONG INT *)
  421. $$:=NewCType(clong_STR,INT_STR);
  422. } |
  423. LONG LONG
  424. {
  425. (* LONG LONG *)
  426. $$:=NewCType(clonglong_STR,INT64_STR);
  427. } |
  428. LONG LONG INT
  429. {
  430. (* LONG LONG INT *)
  431. $$:=NewCType(clonglong_STR,INT64_STR);
  432. } |
  433. SHORT
  434. {
  435. (* SHORT *)
  436. $$:=NewCType(cshort_STR,SMALL_STR);
  437. } |
  438. SHORT INT
  439. {
  440. (* SHORT INT *)
  441. $$:=NewCType(cshort_STR,SMALL_STR);
  442. } |
  443. INT8
  444. {
  445. (* INT8 *)
  446. $$:=NewCType(cint8_STR,SHORT_STR);
  447. } |
  448. INT16
  449. {
  450. (* INT8 *)
  451. $$:=NewCType(cint16_STR,SMALL_STR);
  452. } |
  453. INT32
  454. {
  455. (* INT32 *)
  456. $$:=NewCType(cint32_STR,INT_STR);
  457. } |
  458. INT64
  459. {
  460. (* INT64 *)
  461. $$:=NewCType(cint64_STR,INT64_STR);
  462. } |
  463. FLOAT
  464. {
  465. (* FLOAT *)
  466. $$:=NewCType(cfloat_STR,FLOAT_STR);
  467. } |
  468. VOID
  469. {
  470. (* VOID *)
  471. $$:=NewVoid;
  472. } |
  473. _CHAR
  474. {
  475. (* CHAR *)
  476. $$:=NewCType(cchar_STR,char_STR);
  477. } |
  478. UNSIGNED
  479. {
  480. (* UNSIGNED *)
  481. $$:=NewCType(cunsigned_STR,UINT_STR);
  482. }
  483. ;
  484. simple_type_name :
  485. special_type_name
  486. {
  487. (* special_type_name *)
  488. $$:=$1;
  489. }
  490. |
  491. dname
  492. {
  493. (* dname *)
  494. $$:=CheckUnderscore($1);
  495. }
  496. ;
  497. declarator_list :
  498. declarator_list COMMA declarator
  499. {
  500. (* declarator_list COMMA declarator *)
  501. $$:=HandleDeclarationList($1,$3);
  502. }|
  503. error error_info COMMA declarator_list
  504. {
  505. (* error error_info COMMA declarator_list *)
  506. EmitWriteln(' in declarator_list *)');
  507. $$:=$4;
  508. yyerrok;
  509. }|
  510. error error_info
  511. {
  512. (* error error_info *)
  513. EmitWriteln(' in declarator_list *)');
  514. yyerrok;
  515. }|
  516. declarator
  517. {
  518. (* declarator *)
  519. $$:=NewType1(t_declist,$1);
  520. }
  521. ;
  522. argument_declaration : type_specifier declarator
  523. {
  524. (* type_specifier declarator *)
  525. $$:=NewType2(t_arg,$1,$2);
  526. } |
  527. type_specifier STAR declarator
  528. {
  529. (* type_specifier STAR declarator *)
  530. $$:=HandlePointerArgDeclarator($1,$3);
  531. } |
  532. type_specifier abstract_declarator
  533. {
  534. (* type_specifier abstract_declarator *)
  535. $$:=NewType2(t_arg,$1,$2);
  536. }
  537. ;
  538. argument_declaration_list : argument_declaration
  539. {
  540. (* argument_declaration *)
  541. $$:=NewType2(t_arglist,$1,nil);
  542. } |
  543. argument_declaration COMMA argument_declaration_list
  544. {
  545. (* argument_declaration COMMA argument_declaration_list *)
  546. $$:=HandleArgList($1,$3)
  547. } |
  548. ELLIPSIS
  549. {
  550. (* ELLIPISIS *)
  551. $$:=NewType2(t_arglist,ellipsisarg,nil);
  552. } |
  553. {
  554. (* empty *)
  555. $$:=nil;
  556. }
  557. ;
  558. size_overrider :
  559. _FAR
  560. {
  561. (* FAR *)
  562. $$:=NewID('far');
  563. }
  564. | _NEAR
  565. {
  566. (* NEAR*)
  567. $$:=NewID('near');
  568. }
  569. | _HUGE
  570. {
  571. (* HUGE *)
  572. $$:=NewID('huge');}
  573. ;
  574. declarator :
  575. _CONST declarator
  576. {
  577. (* _CONST declarator *)
  578. EmitIgnoreConst;
  579. $$:=$2;
  580. } |
  581. size_overrider STAR declarator
  582. {
  583. (* size_overrider STAR declarator *)
  584. $$:=HandleSizeOverrideDeclarator($1,$3);
  585. } |
  586. STAR declarator
  587. {
  588. (* %prec PSTAR this was wrong!! *)
  589. $$:=HandleDeclarator(t_pointerdef,$2);
  590. } |
  591. _AND declarator %prec P_AND
  592. {
  593. (* _AND declarator %prec P_AND *)
  594. $$:=HandleDeclarator(t_addrdef,$2);
  595. } |
  596. dname COLON expr
  597. {
  598. (* dname COLON expr *)
  599. $$:=HandleSizedDeclarator($1,$3);
  600. }|
  601. dname ASSIGN expr
  602. {
  603. (* dname ASSIGN expr *)
  604. $$:=HandleDefaultDeclarator($1,$3);
  605. }|
  606. dname
  607. {
  608. (* dname *)
  609. $$:=NewType2(t_dec,nil,$1);
  610. }|
  611. declarator LKLAMMER argument_declaration_list RKLAMMER
  612. {
  613. (* declarator LKLAMMER argument_declaration_list RKLAMMER *)
  614. $$:=HandleDeclarator2(t_procdef,$1,$3);
  615. } |
  616. declarator no_arg
  617. {
  618. (* declarator no_arg *)
  619. $$:=HandleDeclarator2(t_procdef,$1,Nil);
  620. } |
  621. declarator LECKKLAMMER expr RECKKLAMMER
  622. {
  623. (* declarator LECKKLAMMER expr RECKKLAMMER *)
  624. $$:=HandleDeclarator2(t_arraydef,$1,$3);
  625. } |
  626. declarator LECKKLAMMER RECKKLAMMER
  627. {
  628. (* declarator LECKKLAMMER RECKKLAMMER *)
  629. $$:=HandleDeclarator(t_pointerdef,$1);
  630. } |
  631. LKLAMMER declarator RKLAMMER
  632. {
  633. (* LKLAMMER declarator RKLAMMER *)
  634. $$:=$2;
  635. }
  636. ;
  637. no_arg : LKLAMMER RKLAMMER |
  638. LKLAMMER VOID RKLAMMER;
  639. abstract_declarator :
  640. _CONST abstract_declarator
  641. {
  642. (* _CONST abstract_declarator *)
  643. EmitAbstractIgnored;
  644. $$:=$2;
  645. } |
  646. size_overrider STAR abstract_declarator
  647. {
  648. (* size_overrider STAR abstract_declarator *)
  649. $$:=HandleSizedPointerDeclarator($3,$1);
  650. } |
  651. STAR abstract_declarator %prec PSTAR
  652. {
  653. (* STAR abstract_declarator %prec PSTAR *)
  654. $$:=HandlePointerAbstractDeclarator($2);
  655. } |
  656. abstract_declarator LKLAMMER argument_declaration_list RKLAMMER
  657. {
  658. (* abstract_declarator LKLAMMER argument_declaration_list RKLAMMER *)
  659. $$:=HandlePointerAbstractListDeclarator($1,$3);
  660. } |
  661. abstract_declarator no_arg
  662. {
  663. (* abstract_declarator no_arg *)
  664. $$:=HandleFuncNoArg($1);
  665. } |
  666. abstract_declarator LECKKLAMMER expr RECKKLAMMER
  667. {
  668. (* abstract_declarator LECKKLAMMER expr RECKKLAMMER *)
  669. $$:=HandleSizedArrayDecl($1,$3);
  670. } |
  671. declarator LECKKLAMMER RECKKLAMMER
  672. {
  673. (* declarator LECKKLAMMER RECKKLAMMER *)
  674. $$:=HandleArrayDecl($1);
  675. } |
  676. LKLAMMER abstract_declarator RKLAMMER
  677. {
  678. (* LKLAMMER abstract_declarator RKLAMMER *)
  679. $$:=$2;
  680. } |
  681. {
  682. $$:=NewType2(t_dec,nil,nil);
  683. }
  684. ;
  685. expr : shift_expr
  686. {
  687. (* shift_expr *)
  688. $$:=$1;
  689. }
  690. ;
  691. shift_expr :
  692. expr _ASSIGN expr
  693. { $$:=NewBinaryOp(':=',$1,$3); }
  694. | expr EQUAL expr
  695. { $$:=NewBinaryOp('=',$1,$3);}
  696. | expr UNEQUAL expr
  697. { $$:=NewBinaryOp('<>',$1,$3);}
  698. | expr GT expr
  699. { $$:=NewBinaryOp('>',$1,$3);}
  700. | expr GTE expr
  701. { $$:=NewBinaryOp('>=',$1,$3);}
  702. | expr LT expr
  703. { $$:=NewBinaryOp('<',$1,$3);}
  704. | expr LTE expr
  705. { $$:=NewBinaryOp('<=',$1,$3);}
  706. | expr _PLUS expr
  707. { $$:=NewBinaryOp('+',$1,$3);}
  708. | expr MINUS expr
  709. { $$:=NewBinaryOp('-',$1,$3);}
  710. | expr STAR expr
  711. { $$:=NewBinaryOp('*',$1,$3);}
  712. | expr _SLASH expr
  713. { $$:=NewBinaryOp('/',$1,$3);}
  714. | expr _OR expr
  715. { $$:=NewBinaryOp(' or ',$1,$3);}
  716. | expr _AND expr
  717. { $$:=NewBinaryOp(' and ',$1,$3);}
  718. | expr _NOT expr
  719. { $$:=NewBinaryOp(' not ',$1,$3);}
  720. | expr _SHL expr
  721. { $$:=NewBinaryOp(' shl ',$1,$3);}
  722. | expr _SHR expr
  723. { $$:=NewBinaryOp(' shr ',$1,$3);}
  724. | expr QUESTIONMARK colon_expr
  725. {
  726. HandleTernary($1,$3);
  727. } |
  728. unary_expr {$$:=$1;}
  729. ;
  730. colon_expr : expr COLON expr
  731. {
  732. (* if A then B else C *)
  733. $$:=NewType3(t_ifexpr,nil,$1,$3);
  734. }
  735. ;
  736. maybe_empty_unary_expr :
  737. unary_expr
  738. { $$:=$1; }
  739. |
  740. { $$:=nil;}
  741. ;
  742. unary_expr:
  743. dname
  744. {
  745. $$:=$1;
  746. } |
  747. special_type_name
  748. {
  749. $$:=$1;
  750. } |
  751. CSTRING
  752. {
  753. (* remove L prefix for widestrings *)
  754. $$:=CheckWideString(act_token);
  755. } |
  756. NUMBER
  757. {
  758. $$:=NewID(act_token);
  759. } |
  760. unary_expr POINT expr
  761. {
  762. $$:=NewBinaryOp('.',$1,$3);
  763. } |
  764. unary_expr DEREF expr
  765. {
  766. $$:=NewBinaryOp('^.',$1,$3);
  767. } |
  768. MINUS unary_expr
  769. {
  770. $$:=NewUnaryOp('-',$2);
  771. }|
  772. _PLUS unary_expr
  773. {
  774. $$:=NewUnaryOp('+',$2);
  775. }|
  776. _AND unary_expr %prec R_AND
  777. {
  778. $$:=NewUnaryOp('@',$2);
  779. }|
  780. _NOT unary_expr
  781. {
  782. $$:=NewUnaryOp(' not ',$2);
  783. } |
  784. LKLAMMER dname RKLAMMER maybe_empty_unary_expr
  785. {
  786. if assigned($4) then
  787. $$:=NewType2(t_typespec,$2,$4)
  788. else
  789. $$:=$2;
  790. } |
  791. LKLAMMER type_specifier RKLAMMER unary_expr
  792. {
  793. $$:=NewType2(t_typespec,$2,$4);
  794. } |
  795. LKLAMMER type_specifier STAR RKLAMMER unary_expr
  796. {
  797. $$:=HandlePointerType($2,$5,Nil);
  798. } |
  799. LKLAMMER type_specifier size_overrider STAR RKLAMMER unary_expr
  800. {
  801. $$:=HandlePointerType($2,$6,$3);
  802. } |
  803. dname LKLAMMER exprlist RKLAMMER
  804. {
  805. $$:=HandleFuncExpr($1,$3);
  806. } |
  807. LKLAMMER shift_expr RKLAMMER
  808. {
  809. $$:=$2;
  810. } |
  811. LKLAMMER STAR unary_expr RKLAMMER maybe_space LKLAMMER exprlist RKLAMMER
  812. {
  813. $$:=NewType2(t_callop,$3,$7);
  814. } |
  815. dname LECKKLAMMER exprlist RECKKLAMMER
  816. {
  817. $$:=NewType2(t_arrayop,$1,$3);
  818. }
  819. ;
  820. enum_list :
  821. enum_element COMMA enum_list
  822. {
  823. (*enum_element COMMA enum_list *)
  824. $$:=$1;
  825. $$^.next:=$3;
  826. } |
  827. enum_element
  828. {
  829. (* enum element *)
  830. $$:=$1;
  831. } |
  832. {
  833. (* empty enum list *)
  834. $$:=nil;
  835. };
  836. enum_element :
  837. dname _ASSIGN expr
  838. {
  839. (* enum_element: dname _ASSIGN expr *)
  840. $$:=NewType2(t_enumlist,$1,$3);
  841. } |
  842. dname
  843. {
  844. (* enum_element: dname *)
  845. $$:=NewType2(t_enumlist,$1,nil);
  846. };
  847. def_expr :
  848. unary_expr
  849. {
  850. (* unary_expr *)
  851. $$:=HandleUnaryDefExpr($1);
  852. }
  853. ;
  854. para_def_expr :
  855. SPACE_DEFINE def_expr
  856. {
  857. (* SPACE_DEFINE def_expr *)
  858. $$:=$2;
  859. } |
  860. maybe_space LKLAMMER def_expr RKLAMMER
  861. {
  862. (* maybe_space LKLAMMER def_expr RKLAMMER *)
  863. $$:=$3
  864. }
  865. ;
  866. exprlist : exprelem COMMA exprlist
  867. {
  868. (*exprlist COMMA expr*)
  869. $$:=$1;
  870. $1^.next:=$3;
  871. } |
  872. exprelem
  873. {
  874. (* exprelem *)
  875. $$:=$1;
  876. } |
  877. {
  878. (* empty expression list *)
  879. $$:=nil;
  880. };
  881. exprelem :
  882. expr
  883. {
  884. (*expr *)
  885. $$:=NewType1(t_exprlist,$1);
  886. };
  887. %%
  888. function yylex : Integer;
  889. begin
  890. yylex:=scan.yylex;
  891. line_no:=yylineno;
  892. end;
  893. end.