idl.g
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:11k
源码类别:

编译器/解释器

开发平台:

Others

  1. header { 
  2.   import java.io.*;
  3.   import java.util.Vector;
  4.   import java.util.Hashtable;
  5.  }
  6. /**
  7.  *  This is a complete parser for the IDL language as defined
  8.  *  by the CORBA 2.0 specification.  It will allow those who
  9.  *  need an IDL parser to get up-and-running very quickly.
  10.  *  Though IDL's syntax is very similar to C++, it is also
  11.  *  much simpler, due in large part to the fact that it is
  12.  *  a declarative-only language.
  13.  *  
  14.  *  Some things that are not included are: Symbol table construction
  15.  *  (it is not necessary for parsing, btw) and preprocessing (for
  16.  *  IDL compiler #pragma directives). You can use just about any
  17.  *  C or C++ preprocessor, but there is an interesting semantic
  18.  *  issue if you are going to generate code: In C, #include is
  19.  *  a literal include, in IDL, #include is more like Java's import:
  20.  *  It adds definitions to the scope of the parse, but included
  21.  *  definitions are not generated.
  22.  *
  23.  *  Jim Coker, jcoker@magelang.com
  24.  */
  25. class IDLParser extends Parser;
  26. options {
  27. exportVocab=IDL;
  28. }
  29. specification 
  30. :   (definition)+
  31.    ;
  32. definition 
  33. :   (   type_dcl SEMI!
  34.     |   const_dcl SEMI!
  35.       |   except_dcl SEMI!
  36.     |   interf SEMI!
  37.     |   module SEMI!
  38.     )
  39. ;
  40. module
  41. :    "module" 
  42.      identifier 
  43.        LCURLY d:definition_list RCURLY
  44. ;
  45. definition_list
  46. :   (definition)+ 
  47. ;
  48. interf
  49. :   "interface"  
  50.     identifier 
  51.     inheritance_spec
  52.       (interface_body)?
  53. ;
  54. interface_body 
  55. :   LCURLY! (export)*  RCURLY!
  56. ;
  57. export
  58. :   (   type_dcl SEMI
  59.     |   const_dcl SEMI
  60.     |   except_dcl SEMI
  61.     |   attr_dcl SEMI
  62.     |   op_dcl SEMI
  63.             )
  64. ;
  65. inheritance_spec
  66. :   COLON scoped_name_list
  67. |   
  68. ;
  69. scoped_name_list
  70. :    scoped_name (COMMA scoped_name)* 
  71. ;
  72. scoped_name 
  73. :   opt_scope_op identifier (SCOPEOP identifier)*
  74. ;
  75. opt_scope_op
  76. :   SCOPEOP 
  77. |
  78. ;
  79. const_dcl
  80. :   "const" const_type identifier ASSIGN const_exp
  81. ;
  82. const_type 
  83. :   integer_type
  84. |   char_type
  85. |   boolean_type
  86. |   floating_pt_type
  87. |   string_type
  88. |   scoped_name
  89. ;
  90. /*   EXPRESSIONS   */
  91. const_exp
  92. :   or_expr 
  93. ;
  94. or_expr
  95. :   xor_expr 
  96.      (   or_op
  97. xor_expr 
  98.              )*
  99. ;
  100. or_op
  101. :    OR
  102. ;
  103. xor_expr
  104. :    and_expr 
  105.      (  xor_op
  106. and_expr 
  107.              )*
  108. ;
  109. xor_op
  110. :    XOR
  111. ;
  112. and_expr
  113. :    shift_expr 
  114.      (  and_op
  115. shift_expr 
  116.              )*
  117. ;
  118. and_op
  119. :    AND
  120. ;
  121. shift_expr
  122. :    add_expr 
  123.      (  shift_op
  124.       add_expr 
  125.      )*
  126. ;
  127. shift_op
  128. :    LSHIFT
  129. |    RSHIFT
  130. ;
  131. add_expr
  132. :    mult_expr 
  133.      (  add_op    
  134. mult_expr 
  135.              )*
  136. ;
  137. add_op
  138. :    PLUS 
  139. |    MINUS 
  140. ;
  141. mult_expr
  142. :   unary_expr 
  143.      (  mult_op 
  144. unary_expr 
  145.              )*
  146. ;
  147. mult_op
  148. :    STAR 
  149. |    DIV 
  150. |    MOD
  151. ;
  152. unary_expr
  153. :    unary_operator primary_expr
  154. |    primary_expr
  155. ;
  156. unary_operator
  157. :   MINUS
  158. |   PLUS
  159. |   TILDE
  160. ;
  161. // Node of type TPrimaryExp serves to avoid inf. recursion on tree parse
  162. primary_expr
  163. :   scoped_name   
  164. |   literal
  165. |   LPAREN const_exp RPAREN
  166. ;
  167. literal 
  168. :   integer_literal
  169. |   string_literal
  170. |   character_literal
  171. |   floating_pt_literal
  172. |   boolean_literal
  173. ;
  174. boolean_literal
  175. :   "TRUE"  
  176. |   "FALSE"
  177. ;
  178. positive_int_const
  179. :    const_exp
  180. ;
  181. type_dcl
  182. :   "typedef" type_declarator  
  183. |   struct_type
  184. |   union_type
  185. |   enum_type
  186. |   
  187. |   "native" simple_declarator 
  188. ;
  189. type_declarator
  190. :   type_spec declarators
  191. ;
  192. type_spec 
  193. :   simple_type_spec
  194. |   constr_type_spec
  195. ;
  196. simple_type_spec
  197. :   base_type_spec
  198. |   template_type_spec
  199. |   scoped_name
  200. ;
  201. base_type_spec
  202. :   integer_type   
  203. |   char_type   
  204. |   boolean_type   
  205. |   floating_pt_type   
  206. |   "octet"   
  207. |   "any"   
  208. ;
  209. integer_type
  210. :  ("unsigned")? ("short" | "long")
  211. ;
  212. char_type
  213. :   "char"
  214. ;
  215. floating_pt_type
  216. :   "float"
  217. |   "double"
  218. ;
  219. boolean_type
  220.         :   "boolean"
  221. ;
  222. template_type_spec
  223. :   sequence_type
  224. |   string_type
  225. ;
  226. constr_type_spec
  227. :   struct_type
  228. |   union_type
  229. |   enum_type
  230. ;
  231. declarators 
  232. :   declarator (COMMA declarator)*
  233. ;
  234. declarator
  235. :   identifier opt_fixed_array_size
  236. ;
  237. opt_fixed_array_size
  238. : (fixed_array_size)*
  239. ;
  240. simple_declarator
  241. :   identifier
  242. ;
  243. struct_type
  244. :   "struct" 
  245.     identifier    
  246.     LCURLY member_list RCURLY
  247. ;
  248. member_list 
  249. :   (member)+
  250. ;
  251. member
  252. :   type_spec declarators SEMI
  253. ;
  254. union_type
  255. :   "union" 
  256.       identifier
  257.          "switch" LPAREN switch_type_spec RPAREN   
  258.                   LCURLY switch_body RCURLY
  259. ;
  260. switch_type_spec
  261. :   integer_type
  262. |   char_type
  263. |   boolean_type
  264. |   enum_type
  265. |   scoped_name
  266. ;
  267. switch_body
  268. :   case_stmt_list
  269. ;
  270. case_stmt_list
  271. :  (case_stmt)+
  272. ;
  273. case_stmt
  274. :   case_label_list element_spec SEMI
  275. ;
  276. case_label_list
  277. :   (case_label)+ 
  278. ;
  279. case_label
  280. :   "case" const_exp COLON
  281. |   "default" COLON
  282. ;
  283. element_spec
  284. :   type_spec declarator
  285. ;
  286. enum_type
  287. :   "enum" identifier LCURLY enumerator_list RCURLY 
  288. ;
  289. enumerator_list
  290. :    enumerator (COMMA enumerator)* 
  291. ;
  292. enumerator
  293. :   identifier
  294. ;
  295. sequence_type
  296. :   "sequence" 
  297.      LT simple_type_spec opt_pos_int GT 
  298. ;
  299. opt_pos_int
  300. :    (COMMA positive_int_const)?
  301. ;
  302. string_type
  303. :   "string" opt_pos_int_br
  304. ;
  305. opt_pos_int_br
  306. :    (LT positive_int_const GT)?
  307. ;
  308. fixed_array_size
  309. :   LBRACK positive_int_const RBRACK
  310. ;
  311. attr_dcl
  312. :   ("readonly")?
  313.             "attribute" param_type_spec
  314.             simple_declarator_list
  315. ;
  316. simple_declarator_list
  317. :     simple_declarator (COMMA simple_declarator)*
  318. ;
  319. except_dcl
  320. :   "exception" 
  321.     identifier 
  322.      LCURLY opt_member_list RCURLY
  323. ;
  324. opt_member_list
  325. :    (member)*
  326. ;
  327. op_dcl
  328. :   op_attribute op_type_spec 
  329.             identifier   
  330.     parameter_dcls            
  331.             opt_raises_expr c:opt_context_expr
  332. ;
  333. opt_raises_expr
  334. :   (raises_expr)?
  335. ;
  336. opt_context_expr
  337. :   (context_expr)?
  338. ;
  339. op_attribute 
  340. :   "oneway"  
  341. |             
  342. ;
  343. op_type_spec
  344. :   param_type_spec 
  345. |   "void"          
  346. ;
  347. parameter_dcls
  348. :  LPAREN (param_dcl_list)? RPAREN!
  349. ;
  350. param_dcl_list
  351. :    param_dcl (COMMA param_dcl)*
  352. ;
  353. param_dcl
  354. :   param_attribute param_type_spec simple_declarator
  355. ;
  356. param_attribute
  357. :   "in"
  358. |   "out"
  359. |   "inout"
  360. ;
  361. raises_expr
  362. :   "raises" LPAREN scoped_name_list RPAREN
  363. ;
  364. context_expr
  365. :   "context" LPAREN string_literal_list RPAREN
  366. ;
  367. string_literal_list
  368. :    string_literal (COMMA! string_literal)*
  369. ;
  370. param_type_spec 
  371. :   base_type_spec
  372. |   string_type
  373. |   scoped_name
  374. ;
  375. integer_literal
  376.   :   INT
  377. |   OCTAL 
  378. |   HEX   
  379.         ;
  380. string_literal
  381. :  (STRING_LITERAL)+
  382. ;
  383. character_literal
  384. :   CHAR_LITERAL
  385. ;
  386. floating_pt_literal
  387. :   f:FLOAT
  388.       ;
  389. identifier
  390. :   IDENT
  391.    ;
  392. /* IDL LEXICAL RULES  */
  393. class IDLLexer extends Lexer;
  394. options {
  395. exportVocab=IDL;
  396. k=4;
  397. }
  398. SEMI
  399. options {
  400.   paraphrase = ";";
  401. }
  402. : ';'
  403. ;
  404. QUESTION
  405. options {
  406.   paraphrase = "?";
  407. }
  408. : '?'
  409. ;
  410. LPAREN
  411. options {
  412.   paraphrase = "(";
  413. }
  414. : '('
  415. ;
  416. RPAREN
  417. options {
  418.   paraphrase = ")";
  419. }
  420. : ')'
  421. ;
  422. LBRACK
  423. options {
  424.   paraphrase = "[";
  425. }
  426. : '['
  427. ;
  428. RBRACK
  429. options {
  430.   paraphrase = "]";
  431. }
  432. : ']'
  433. ;
  434. LCURLY
  435. options {
  436.   paraphrase = "{";
  437. }
  438. : '{'
  439. ;
  440. RCURLY
  441. options {
  442.   paraphrase = "}";
  443. }
  444. : '}'
  445. ;
  446. OR
  447. options {
  448.   paraphrase = "|";
  449. }
  450. : '|'
  451. ;
  452. XOR
  453. options {
  454.   paraphrase = "^";
  455. }
  456. : '^'
  457. ;
  458. AND
  459. options {
  460.   paraphrase = "&";
  461. }
  462. : '&'
  463. ;
  464. COLON
  465. options {
  466.   paraphrase = ":";
  467. }
  468. : ':'
  469. ;
  470. COMMA
  471. options {
  472.   paraphrase = ",";
  473. }
  474. : ','
  475. ;
  476. DOT
  477. options {
  478.   paraphrase = ".";
  479. }
  480. : '.'
  481. ;
  482. ASSIGN
  483. options {
  484.   paraphrase = "=";
  485. }
  486. : '='
  487. ;
  488. NOT
  489. options {
  490.   paraphrase = "!";
  491. }
  492. : '!'
  493. ;
  494. LT
  495. options {
  496.   paraphrase = "<";
  497. }
  498. : '<'
  499. ;
  500. LSHIFT
  501. options {
  502.   paraphrase = "<<";
  503. }
  504. : "<<"
  505. ;
  506. GT
  507. options {
  508.   paraphrase = ">";
  509. }
  510. : '>'
  511. ;
  512. RSHIFT
  513. options {
  514.   paraphrase = ">>";
  515. }
  516. : ">>"
  517. ;
  518. DIV
  519. options {
  520.   paraphrase = "/";
  521. }
  522. : '/'
  523. ;
  524. PLUS
  525. options {
  526.   paraphrase = "+";
  527. }
  528. : '+'
  529. ;
  530. MINUS
  531. options {
  532.   paraphrase = "-";
  533. }
  534. : '-'
  535. ;
  536. TILDE
  537. options {
  538.   paraphrase = "~";
  539. }
  540. : '~'
  541. ;
  542. STAR
  543. options {
  544.   paraphrase = "*";
  545. }
  546. : '*'
  547. ;
  548. MOD
  549. options {
  550.   paraphrase = "%";
  551. }
  552. : '%'
  553. ;
  554. SCOPEOP
  555. options {
  556.   paraphrase = "::";
  557. }
  558. :   "::"
  559. ;
  560. WS
  561. options {
  562.   paraphrase = "white space";
  563. }
  564. : (' '
  565. | 't'
  566. | 'n'  { newline(); }
  567. | 'r')
  568. { $setType(Token.SKIP); }
  569. ;
  570. PREPROC_DIRECTIVE
  571. options {
  572.   paraphrase = "a preprocessor directive";
  573. }
  574. :
  575. '#' 
  576. (~'n')* 'n'
  577. { $setType(Token.SKIP); }
  578. ;
  579. SL_COMMENT 
  580. options {
  581.   paraphrase = "a comment";
  582. }
  583. :
  584. "//" 
  585. (~'n')* 'n'
  586. { $setType(Token.SKIP); newline(); }
  587. ;
  588. ML_COMMENT 
  589. options {
  590.   paraphrase = "a comment";
  591. }
  592. "/*"
  593. (
  594. STRING_LITERAL
  595. | CHAR_LITERAL
  596. | 'n' { newline(); }
  597. | '*' ~'/'
  598. | ~'*'
  599. )*
  600. "*/"
  601. { $setType(Token.SKIP);  }
  602. ;
  603. CHAR_LITERAL 
  604. options {
  605.   paraphrase = "a character literal";
  606. }
  607. :
  608. ''' 
  609. ( ESC | ~''' ) 
  610. '''
  611. ;
  612. STRING_LITERAL 
  613. options {
  614.   paraphrase = "a string literal";
  615. }
  616. :
  617. '"' 
  618. (ESC|~'"')* 
  619. '"'
  620. ;
  621. protected
  622. ESC
  623. options {
  624.   paraphrase = "an escape sequence";
  625. }
  626. : '\'
  627. ( 'n'
  628. | 't'
  629. | 'v'   
  630. | 'b'
  631. | 'r'
  632. | 'f'
  633. | 'a'  
  634. | '\'
  635. | '?'     
  636. | '''
  637. | '"'
  638. | ('0' | '1' | '2' | '3')
  639. (
  640. /* Since a digit can occur in a string literal,
  641.  * which can follow an ESC reference, ANTLR
  642.  * does not know if you want to match the digit
  643.  * here (greedy) or in string literal.
  644.  * The same applies for the next two decisions
  645.  * with the warnWhenFollowAmbig option.
  646.  */
  647. options {
  648. warnWhenFollowAmbig = false;
  649. }
  650. : OCTDIGIT
  651. (
  652. options {
  653. warnWhenFollowAmbig = false;
  654. }
  655. : OCTDIGIT
  656. )?
  657. )?
  658. |   'x' HEXDIGIT
  659. (
  660. options {
  661. warnWhenFollowAmbig = false;
  662. }
  663. : HEXDIGIT
  664. )?
  665. )
  666. ;
  667. protected
  668. VOCAB
  669. options {
  670.   paraphrase = "an escaped character value";
  671. }
  672. : '3'..'377'
  673. ;
  674. protected
  675. DIGIT
  676. options {
  677.   paraphrase = "a digit";
  678. }
  679. : '0'..'9'
  680. ;
  681. protected
  682. OCTDIGIT
  683. options {
  684.   paraphrase = "an octal digit";
  685. }
  686. : '0'..'7'
  687. ;
  688. protected
  689. HEXDIGIT
  690. options {
  691.   paraphrase = "a hexadecimal digit";
  692. }
  693. : ('0'..'9' | 'a'..'f' | 'A'..'F')
  694. ;
  695. /* octal literals are detected by checkOctal */
  696. HEX
  697. options {
  698.   paraphrase = "a hexadecimal value value";
  699. }
  700. :    ("0x" | "0X") (HEXDIGIT)+         
  701. ;
  702. INT
  703. options {
  704.   paraphrase = "an integer value";
  705. }
  706. :    (DIGIT)+                  // base-10 
  707.              (  '.' (DIGIT)*                       {$setType(FLOAT);}
  708.          (('e' | 'E') ('+' | '-')? (DIGIT)+)? 
  709.      |   ('e' | 'E') ('+' | '-')? (DIGIT)+    {$setType(FLOAT);}
  710.              )?
  711. ;
  712. FLOAT
  713. options {
  714.   paraphrase = "an floating point value";
  715. }
  716. :    '.' (DIGIT)+ (('e' | 'E') ('+' | '-')? (DIGIT)+)?
  717.       ;
  718. IDENT
  719. options {
  720.   testLiterals = true;
  721.   paraphrase = "an identifer";
  722. }
  723. : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
  724. ;