h2pas.y 20 KB

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