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

编译器/解释器

开发平台:

Others

  1. /*
  2.  *  Sather 1.2 Grammar
  3.  *
  4.  *  Version 0.1  Mika Illouz   mika@sdna2.ucsd.edu  
  5.  *    Beware: full of mistakes, but its a start.  I'm particularly unsure
  6.  *    about expression precendence, external class definition, and 
  7.  *    closure create expression.  I started tagging various rules with
  8.  *    imaginary tokens, but that job is far from over if the output of the
  9.  *    parser is ever to be handed off to a tree walker.
  10.  *
  11.  *  This grammar is in the PUBLIC DOMAIN.
  12.  */
  13. options {
  14. language = "Sather";
  15. }
  16. class SATHER_PARSER extends Parser;
  17. options {
  18. exportVocab=SATHER;                // Call its vocabulary "SATHER"
  19. codeGenMakeSwitchThreshold = 2;    // Some optimizations
  20. codeGenBitsetTestThreshold = 3;
  21. buildAST = true;
  22. }
  23. tokens {
  24. CLASS_DEFINITION_LIST;
  25. PARAMETER_DECLARATION_LIST;
  26.         ABSTRACT_SIGNATURE_LIST;
  27.         TYPE_SPECIFIER_LIST;
  28. }
  29. parse
  30. : class_definition_list
  31.         ;
  32. class_definition_list
  33. : ( class_definition ( SEMICOLON! ( class_definition )? )* )?
  34.           { @class_definition_list := 
  35.               @([CLASS_DEFINITION_LIST, "CLASS_DEFINITION_LIST"], 
  36.                 @class_definition_list); 
  37.           }
  38. ;
  39. class_definition
  40. : abstract_class_definition 
  41. | concrete_class_definition
  42. | external_class_definition
  43. ;
  44. abstract_class_definition
  45. : "abstract"^ 
  46.           "class"! 
  47.           ABSTRACT_CLASS_NAME
  48.   ( LCURLY! parameter_declaration_list RCURLY! )?
  49.   ( subtyping_clause )?
  50.           ( supertyping_clause )?
  51.           "is"!
  52.   ( abstract_signature_list )?
  53.           "end"!
  54. ;
  55. concrete_class_definition
  56. : ( "immutable" | "partial" )?
  57.   "class"^
  58.   IDENTIFIER
  59.   ( LCURLY parameter_declaration_list RCURLY )?
  60.   ( subtyping_clause )?
  61.           "is"
  62.   ( class_element_list )?
  63.   "end"
  64. ;
  65.     
  66. external_class_definition
  67. : "external" ( IDENTIFIER )? 
  68.           "class" 
  69.           IDENTIFIER
  70.   ( LCURLY parameter_declaration_list RCURLY )?
  71.   ( subtyping_clause )?
  72.           "is"
  73.   ( external_class_element_list )?
  74.   "end"
  75. ;
  76. class_element_list
  77. : class_element ( SEMICOLON! ( class_element )? )*
  78. ;
  79. class_element
  80. : "private" unmodified_definition
  81. | "readonly" ( shared_definition | attr_definition )
  82. | unmodified_definition
  83. | stub_
  84. ;
  85. unmodified_definition
  86. : const_definition 
  87. | shared_definition
  88. | attr_definition
  89. | routine_definition
  90. | iter_definition
  91. | include_clause
  92. ;
  93. const_definition
  94. : "const" 
  95.   IDENTIFIER
  96.   ( ( COLON type_specifier ASSIGN expression )
  97.           | ( ( ASSIGN expression )? ( COMMA identifier_list )? )
  98.           )
  99. ;
  100. shared_definition
  101. : "shared"
  102.   ( IDENTIFIER 
  103.             ( COLON type_specifier ( ASSIGN expression )?
  104.             | ( COMMA! IDENTIFIER )+ COLON type_specifier 
  105.             )
  106.           )
  107. ;
  108. attr_definition
  109. : "attr" identifier_list COLON type_specifier 
  110. ;
  111. routine_definition
  112. : IDENTIFIER
  113.   ( LPAREN! routine_argument_list RPAREN! )?
  114.   ( COLON type_specifier )?
  115.   ( "pre" expression )?
  116.   ( "post" expression )?
  117.   "is" ( statement_list | builtin_statement ) "end"  // not optional: typo on page 31 of spec?
  118. ;
  119. iter_definition
  120. : ITER_NAME
  121.   ( LPAREN! iter_argument_list RPAREN! )?
  122.   ( COLON type_specifier )?
  123.   ( "pre" expression )?
  124.   ( "post" expression )?
  125.   "is" ( statement_list | builtin_statement ) "end"
  126. ;
  127. include_clause
  128. : "include" type_specifier ( feature_modifier_list )?
  129. ;
  130. feature_modifier_list
  131. : feature_modifier ( COMMA! feature_modifier )*
  132. ;
  133. feature_modifier
  134. : IDENTIFIER RIGHT_ARROW ( ( "private" | "readonly" )? IDENTIFIER )?
  135. | ITER_NAME  RIGHT_ARROW ( ( "private" | "readonly" )? ITER_NAME  )?
  136. ;
  137. stub_
  138. : "stub" abstract_signature // typo on page 34 of spec?
  139. ;
  140. statement_list
  141. : ( statement )? ( SEMICOLON! ( statement )? )* 
  142. ;
  143. external_class_element
  144. : "private" unmodified_definition
  145. | "readonly" ( shared_definition | attr_definition )
  146.         // getting lazy here... should really left-factor, but that would
  147.         // be very messy
  148.         | ( unmodified_definition )=> unmodified_definition 
  149.         | abstract_signature
  150.         ;
  151. external_class_element_list
  152. : external_class_element ( SEMICOLON! ( external_class_element )? )*
  153.         ;
  154. builtin_statement
  155. : "builtin" IDENTIFIER ( SEMICOLON! )?
  156. ;
  157. statement
  158. : declaration_or_expression_statement
  159. | if_statement
  160. | return_statement
  161. | case_statement
  162. | typecase_statement
  163. | loop_statement
  164. | yield_statement
  165. | quit_statement
  166. | protect_statement
  167. | raise_statement
  168. | assert_statement
  169. ;
  170. declaration_or_expression_statement
  171. : ( IDENTIFIER ( COLON | COMMA | DBL_COLON_ASSIGN ) )=> declaration_statement
  172. | expression
  173. ;
  174. declaration_statement
  175.         : IDENTIFIER 
  176.           ( COLON type_specifier ( ASSIGN expression )? 
  177.           | DBL_COLON_ASSIGN expression
  178.           | ( COMMA! IDENTIFIER )+ COLON type_specifier 
  179.           )
  180. ;
  181. assert_statement
  182. : "assert" expression
  183. ;
  184. if_statement
  185. : "if" expression "then" statement_list 
  186.   ( "elsif" expression "then" statement_list )*  
  187.   ( "else" statement_list )?
  188.           "end"
  189. ;
  190. return_statement
  191. : "return" ( expression )?
  192. ;
  193. case_statement
  194. : "case" expression 
  195.   ( "when" expression ( COMMA! expression )* "then" statement_list )+
  196.   ( "else" statement_list )?
  197.   "end"
  198. ;
  199. typecase_statement
  200. : "typecase" IDENTIFIER
  201.   ( "when" type_specifier "then" statement_list )+
  202.   ( "else" statement_list )?
  203.   "end"
  204. ;
  205. loop_statement
  206. : "loop" statement_list "end"
  207. ;
  208. yield_statement
  209. : "yield" ( expression )?
  210. ;
  211. quit_statement
  212. : "quit" 
  213. ;
  214. protect_statement
  215. : "protect" statement_list
  216.   ( "when" type_specifier "then" statement_list )*
  217.   ( "else" statement_list )?
  218.   "end"
  219. ;
  220. raise_statement
  221. : "raise" expression
  222. ;
  223. // going out on a limb, here.
  224. closure_create_expression
  225. : "bind"
  226.   LPAREN
  227.   closure_class_call_expression
  228.     RPAREN
  229. ;
  230. expression_list
  231. : expression ( COMMA! expression )*
  232. ;
  233. // expressions
  234. // Note that most of these expressions follow the pattern
  235. //   this_level_expression :
  236. //       next_higher_precedence_expression
  237. //           (OPERATOR next_higher_precedence_expression)*
  238. // which is a standard recursive definition for a parsing an expression.
  239. expression
  240. : assignment_expression
  241. ;
  242. assignment_expression
  243. : logical_expression ( ASSIGN logical_expression )?
  244. ;
  245. logical_expression
  246. : relational_expression ( ( "and" | "or" ) relational_expression )*
  247. ;
  248. relational_expression
  249. : add_sub_expression
  250.   ( 
  251.     ( LESS_THAN 
  252.             | LESS_THAN_EQUAL 
  253.     | EQUAL 
  254.     | NOT_EQUAL 
  255.     | GREATER_THAN_EQUAL 
  256.     | GREATER_THAN
  257.             )
  258.     add_sub_expression
  259.   )*
  260. ;
  261. add_sub_expression
  262. : mult_div_mod_expression ( ( PLUS | MINUS ) mult_div_mod_expression )*
  263. ;
  264. mult_div_mod_expression
  265. : unary_expression ( ( STAR | SLASH | PERCENT ) unary_expression )*
  266. ;
  267. unary_expression
  268. : ( NOT | MINUS )? raise_expression
  269. ;
  270. raise_expression
  271. : class_call_expression ( CARET class_call_expression )*
  272. ;
  273. class_call_expression
  274. : ( type_specifier DBL_COLON )=>
  275.             type_specifier DBL_COLON deref_expression 
  276. | deref_expression
  277. ;
  278. deref_expression
  279. : call_expression ( DOT call_expression )*
  280. ;
  281. call_expression
  282. : primary_expression 
  283.   ( LPAREN call_argument_list RPAREN ( LSQUARE expression_list RSQUARE )*
  284.   | ( LSQUARE call_argument_list RSQUARE )+
  285.   )?
  286. | "new" ( LPAREN expression RPAREN )?
  287. | "void" ( LPAREN expression RPAREN )?
  288. | HASH ( type_specifier )? ( LPAREN call_argument_list RPAREN )?
  289. | LSQUARE expression_list RSQUARE // aget() does not accept modes, right?
  290. ;
  291. call_argument_list
  292. : ( ( iter_mode )? expression ) ( COMMA! ( iter_mode )? expression )*
  293. ;
  294. primary_expression
  295. : LPAREN expression RPAREN
  296. | IDENTIFIER
  297. | ITER_NAME
  298. | bool_literal_expression
  299. | CHAR_LITERAL
  300. | ( STRING_LITERAL )+
  301. | INT_LITERAL
  302. | FLT_LITERAL
  303. | array_expression
  304. | self_expression
  305. | while_expression
  306. | until_expression
  307. | break_expression
  308. | except_expression
  309. | initial_expression
  310. | result_expression
  311. | closure_create_expression
  312. ;
  313. // variants for use in closure definitions, where we augment the 
  314. // notion of expression to include an UNDERSCORE.  Used only in
  315. // closure_create_expression
  316. closure_class_call_expression
  317. : ( type_specifier DBL_COLON )=>
  318.             type_specifier DBL_COLON closure_deref_expression 
  319. | closure_deref_expression
  320. ;
  321. closure_deref_expression
  322. : closure_call_expression ( DOT closure_call_expression )?
  323. ;
  324. closure_call_expression
  325. : ( primary_expression | UNDERSCORE )
  326.   ( LPAREN closure_argument_list RPAREN ( LSQUARE closure_expression_list RSQUARE )*
  327.   | ( LSQUARE closure_argument_list RSQUARE )+
  328.   )?
  329. | LSQUARE closure_expression_list RSQUARE
  330. ;
  331. closure_argument_list
  332. : ( ( iter_mode )? closure_expression ) ( COMMA! ( ( iter_mode )? closure_expression ) )*
  333. ;
  334. closure_expression_list
  335. : closure_expression ( COMMA! closure_expression )*
  336. ;
  337. closure_expression
  338. : expression
  339. | UNDERSCORE
  340. ;
  341. except_expression
  342. : "exception"
  343. ;
  344. initial_expression
  345. : "initial" LPAREN! expression RPAREN!
  346. ;
  347. result_expression
  348. : "result"
  349. ;
  350. self_expression
  351. : "self"
  352. ;
  353. while_expression
  354. : "while!" LPAREN! expression RPAREN!
  355. ;
  356. until_expression
  357. : "until!" LPAREN! expression RPAREN!
  358. ;
  359. break_expression
  360. : "break!"
  361. ;
  362. array_expression 
  363. : BAR expression_list BAR
  364. ;
  365. bool_literal_expression
  366. : "true" 
  367. | "false"
  368. ;
  369. parameter_declaration_list
  370. : parameter_declaration ( COMMA! parameter_declaration )*
  371.           { @parameter_declaration_list := 
  372.               @([PARAMETER_DECLARATION_LIST, "PARAMETER_DECLARATION_LIST"], 
  373.                 @parameter_declaration_list); 
  374.           }
  375. ;
  376. parameter_declaration
  377. : IDENTIFIER ( LESS_THAN type_specifier )?
  378.         ;
  379. supertyping_clause
  380. : GREATER_THAN^ type_specifier_list
  381.         ;
  382. subtyping_clause
  383. : LESS_THAN^ type_specifier_list
  384.         ;
  385. abstract_signature_list
  386. : abstract_signature ( SEMICOLON! ( abstract_signature )? )*
  387.           { @abstract_signature_list :=
  388.               @([ABSTRACT_SIGNATURE_LIST, "ABSTRACT_SIGNATURE_LIST"],
  389.                 @abstract_signature_list);
  390.           }
  391.         ;
  392. abstract_signature
  393. : abstract_routine_signature
  394. | abstract_iter_signature
  395. ;
  396. abstract_routine_signature
  397. : IDENTIFIER
  398.   ( LPAREN routine_argument_list RPAREN )?
  399.   ( COLON type_specifier )?
  400.         ;
  401. abstract_iter_signature
  402. : ITER_NAME
  403.   ( LPAREN iter_argument_list RPAREN )?
  404.   ( COLON type_specifier )?
  405. ;
  406. routine_argument_list
  407. : routine_argument ( COMMA! routine_argument )*
  408. ;
  409. routine_argument
  410. : ( routine_mode )? IDENTIFIER 
  411.           ( COMMA! ( routine_mode )? IDENTIFIER )*
  412.           COLON type_specifier
  413. ;
  414. iter_argument_list
  415. : iter_argument ( COMMA! iter_argument )*
  416. ;
  417. iter_argument
  418. : ( iter_mode )? IDENTIFIER 
  419.           ( COMMA! ( iter_mode )? IDENTIFIER )*
  420.           COLON type_specifier
  421. ;
  422. non_identifier_type_specifier
  423.         : ABSTRACT_CLASS_NAME ( LCURLY type_specifier_list RCURLY )? 
  424. | method_closure_type_specifier
  425.         | "SAME"
  426. ;
  427. type_specifier
  428. : IDENTIFIER ( LCURLY type_specifier_list RCURLY )? 
  429.   | non_identifier_type_specifier
  430. ;
  431. type_specifier_list
  432. : type_specifier ( COMMA! type_specifier )*
  433.           { @type_specifier_list :=
  434.               @([TYPE_SPECIFIER_LIST,"TYPE_SPECIFIER_LIST"], 
  435.                 @type_specifier_list);
  436.           }
  437.         ;
  438. method_closure_type_specifier
  439. : routine_closure_type_specifier
  440. | iter_closure_type_specifier
  441. ;
  442. routine_closure_type_specifier
  443. : "ROUT" 
  444.           ( LCURLY! routine_type_specifier_list RCURLY! )?
  445.           ( COLON type_specifier )?
  446.         ;
  447. iter_closure_type_specifier
  448. : "ITER" 
  449.           ( LCURLY! iter_type_specifier_list RCURLY! )?
  450.           ( COLON type_specifier )?
  451.         ;
  452. iter_type_specifier_list
  453. : iter_type_specifier ( COMMA! iter_type_specifier )*
  454. ;
  455. routine_type_specifier_list
  456. : routine_type_specifier ( COMMA! routine_type_specifier )*
  457. ;
  458. routine_type_specifier
  459. : ( routine_mode )? type_specifier
  460. ;
  461. iter_type_specifier
  462. : ( iter_mode )? type_specifier
  463. ;
  464. routine_mode
  465. : "in" | "out" | "inout"
  466. ;
  467. iter_mode
  468. : routine_mode 
  469.         | "once"
  470. ;
  471. identifier_list
  472. : IDENTIFIER ( COMMA! IDENTIFIER )*
  473. ;
  474. class SATHER_LEXER extends Lexer;
  475. options {
  476. exportVocab = SATHER;
  477.         testLiterals = true;
  478. k=2;
  479. }
  480. // operators, etc.
  481. LCURLY             : '{'  ;
  482. RCURLY             : '}'  ;
  483. LPAREN             : '('  ;
  484. RPAREN             : ')'  ;
  485. LSQUARE            : '['  ;
  486. RSQUARE            : ']'  ;
  487. COMMA              : ','  ;
  488. COLON              : ':'  ;
  489. SEMICOLON          : ';'  ;
  490. LESS_THAN          : '<'  ;
  491. GREATER_THAN       : '>'  ;
  492. EXCLAMATION        : '!'  ;
  493. MINUS              : '-'  ;
  494. PLUS               : '+'  ;
  495. STAR               : '*'  ;
  496. SLASH              : '/'  ;
  497. EQUAL              : '='  ;
  498. NOT                : '~'  ;
  499. DOT                : '.'  ;
  500. HASH               : '#'  ;
  501. BAR                : '|'  ;
  502. PERCENT            : '%'  ;
  503. CARET              : '^'  ;
  504. ASSIGN             : ":=" ; 
  505. RIGHT_ARROW        : "->" ;
  506. NOT_EQUAL          : "/=" ;
  507. LESS_THAN_EQUAL    : "<=" ;
  508. GREATER_THAN_EQUAL : ">=" ;
  509. protected DBL_COLON        : "::"  ;
  510. protected DBL_COLON_ASSIGN : "::=" ;
  511. protected UNDERSCORE : '_' ;
  512. protected DOLLAR     : '$' ;
  513. protected
  514. IDENTIFIER
  515. : ( 'a'..'z' | 'A'..'Z' | '_' ) ( 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' )*
  516.         ; // TODO: reject IDENTIFIERS without at least one letter
  517. protected
  518. ITER_NAME
  519. : IDENTIFIER EXCLAMATION
  520.         ; 
  521. protected
  522. BINARY_INT
  523. : "0b" ( '0' | '1' | '_' )*
  524. ;
  525. protected
  526. OCTAL_INT
  527. : "0o" ( '0'..'9' | '_' )*
  528. ;
  529. protected
  530. HEX_INT
  531. : "0x" ( '0'..'9' | 'a'..'f' | '_' )*
  532. ;
  533. protected
  534. DECIMAL_INT
  535. : ( '0'..'9' ) ( '0'..'9' | '_' )* 
  536. ;
  537. protected
  538. INT_LITERAL
  539. : ( DECIMAL_INT | BINARY_INT | OCTAL_INT | HEX_INT ) ( 'i' )?
  540. ;
  541. protected
  542. FLT_LITERAL
  543. : DECIMAL_INT DOT DECIMAL_INT ( 'e' ( MINUS )? DECIMAL_INT )? ( 'd' )?
  544. ;
  545.  
  546. COLON_OR_ASSIGN
  547. : "::" { %setType(DBL_COLON); } 
  548.           ( '=' { %setType(DBL_COLON_ASSIGN); } )?
  549. ;
  550. NUM_LITERAL
  551. : ( DECIMAL_INT DOT DECIMAL_INT )=>
  552.           FLT_LITERAL  { %setType(FLT_LITERAL); }
  553.           | DECIMAL_INT ( 'i' )? { %setType(INT_LITERAL); }
  554.         | ( ( BINARY_INT | OCTAL_INT | HEX_INT ) ( 'i' )? { %setType(INT_LITERAL); } )
  555. ;
  556. ABSTRACT_CLASS_NAME
  557. : DOLLAR IDENTIFIER
  558.         ;
  559. ITER_NAME_OR_IDENTIFIER_OR_UNDERSCORE
  560. : '_' { %setType(UNDERSCORE); } 
  561.           ( ( 'a'..'z' | 'A'..'Z' | '_' | '0'..'9' )+  { %setType(IDENTIFIER); } 
  562.             ( EXCLAMATION { %setType(ITER_NAME); } )? 
  563.           )?
  564.         | ( ( 'a'..'z' | 'A'..'Z' )
  565.             ( 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' )* { %setType(IDENTIFIER); } 
  566.             ( EXCLAMATION { %setType(ITER_NAME); } )? 
  567.           )
  568.         ;
  569. // what follows is shamelessly taken from java.g:  thanks guys!
  570. // character literals
  571. CHAR_LITERAL
  572. : ''' ( ESC | ~''' ) '''
  573. ;
  574. // string literals
  575. STRING_LITERAL
  576. : '"' (ESC|~('"'|'\'))* '"'
  577. ;
  578. // escape sequence -- note that this is protected; it can only be called
  579. //   from another lexer rule -- it will not ever directly return a token to
  580. //   the parser
  581. // There are various ambiguities hushed in this rule.  The optional
  582. // '0'...'9' digit matches should be matched here rather than letting
  583. // them go back to STRING_LITERAL to be matched.  ANTLR does the
  584. // right thing by matching immediately; hence, it's ok to shut off
  585. // the FOLLOW ambig warnings.
  586. protected
  587. ESC
  588. : '\'
  589.  ( 'n'
  590.  | 'r'
  591.  | 't'
  592.  | 'b'
  593.  | 'f'
  594.  | 'v' // Sather/Library/char.sa uses v -- still needed?
  595.          |      'a'
  596.  | '"'
  597.  | '''
  598.  | '\'
  599.  | ('u')+ HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT 
  600.  | ('0'..'3')
  601. (
  602. options {
  603. warnWhenFollowAmbig = false;
  604. }
  605. : ('0'..'9')
  606. (
  607. options {
  608. warnWhenFollowAmbig = false;
  609. }
  610. : '0'..'9'
  611. )?
  612. )?
  613.  | ('4'..'7')
  614. (
  615. options {
  616. warnWhenFollowAmbig = false;
  617. }
  618. : ('0'..'9')
  619. )?
  620.  )
  621. ;
  622. // hexadecimal digit (again, note it's protected!)
  623. protected
  624. HEX_DIGIT
  625. : ('0'..'9'|'A'..'F'|'a'..'f')
  626. ;
  627. // a dummy rule to force vocabulary to be all characters (except special
  628. //   ones that ANTLR uses internally (0 to 2)
  629. protected
  630. VOCAB
  631. : '3'..'377'
  632. ;
  633. // Single-line comments
  634. SL_COMMENT
  635. : "--"
  636.   (~('n'|'r'))* ('n'|'r'('n')?)
  637.   { %setType(ANTLR_COMMON_TOKEN::SKIP); newline; }
  638. ;
  639. // multiple-line comments
  640. ML_COMMENT
  641. : "(*"
  642.     ( options { greedy=false; }
  643.     : 'r' 'n' { newline; }
  644.     | 'r'  { newline; }
  645.     | 'n' { newline; }
  646.     | .
  647.     )*
  648.   "*)"
  649.           { %setType(ANTLR_COMMON_TOKEN::SKIP); }
  650. ;
  651. // Whitespace -- ignored
  652. WS
  653. : ( ' '
  654.   | 't'
  655.   | 'f'
  656.   // handle newlines
  657.   | ( "rn"  // Evil DOS
  658.    | 'r'    // Macintosh
  659. | 'n'    // Unix (the right way)
  660. )
  661. { newline; }
  662.   )
  663.   { %setType(ANTLR_COMMON_TOKEN::SKIP); }
  664. ;