Advertisement
Guest User

Untitled

a guest
Jun 12th, 2012
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.90 KB | None | 0 0
  1. grammar Go::Grammar;
  2.  
  3. token TOP {
  4. # ^ <binary_op> $
  5. # ^ <block>
  6. # ^ <statement>
  7. # ^ <top_level_decl>
  8. ^ <source_file>
  9. # $
  10. }
  11.  
  12. token ws {
  13. [<[\ \t\r\n]>]*
  14. }
  15.  
  16. ## this is a rule so whitespace is added around it
  17. token com {
  18. <.ws>? ',' <.ws>?
  19. }
  20.  
  21. token semi {
  22. <.ws>? ';' <.ws>?
  23. }
  24. # | <?before <.ws>? ')' <.ws>?>
  25. # | <?before <.ws>? '}' <.ws>?>
  26.  
  27. token automatic_semicolon {
  28. [ [<?after <.identifier> >
  29. | <?after <.basic_lit> >
  30. | <?after 'break'>
  31. | <?after 'continue'>
  32. | <?after 'fallthrough'>
  33. | <?after 'return'>
  34. | <?after '++'>
  35. | <?after '--'>
  36. | <?after ')'>
  37. | <?after ']'>
  38. | <?after '}'>
  39. ] $$ ]
  40. | <?before ')'>
  41. | <?before '}'>
  42. }
  43.  
  44. ######################################################################
  45. ## Lexical elements
  46.  
  47. #### Characters
  48.  
  49. regex unicode_letter {
  50. <.alpha>
  51. }
  52.  
  53. regex unicode_digit {
  54. <.digit>
  55. }
  56.  
  57. #### Letters and digits
  58.  
  59. regex letter {
  60. <unicode_letter> | '_'
  61. }
  62.  
  63. regex decimal_digit {
  64. <.digit>
  65. }
  66.  
  67. regex octal_digit {
  68. <[0..7]>
  69. }
  70.  
  71. regex hex_digit {
  72. <.xdigit>
  73. }
  74.  
  75. #### Comments
  76. #### Semicolons
  77. #### Identifiers
  78.  
  79. token identifier {
  80. <.letter> [<.letter> | <.unicode_digit>]*
  81. }
  82.  
  83. #### Keywords
  84. #### Operators and Delimiters
  85. #### Integer literals
  86.  
  87. token int_lit {
  88. | <hex_lit>
  89. | <octal_lit>
  90. | <decimal_lit>
  91. }
  92.  
  93. token decimal_lit {
  94. <[1..9]> <.decimal_digit>*
  95. }
  96.  
  97. token octal_lit {
  98. 0 <.octal_digit>*
  99. }
  100.  
  101. token hex_lit {
  102. 0x <.hex_digit>+
  103. }
  104.  
  105. #### Floating-point literals
  106.  
  107. token float_lit {
  108. | <.decimals> '.' <.decimals>? <exponent>?
  109. | <.decimals> <exponent>
  110. | '.' <.decimals> <exponent>?
  111. }
  112.  
  113. token decimals {
  114. <.decimal_digit>+
  115. }
  116.  
  117. token exponent {
  118. <[eE]> <[+-]>? <.decimals>
  119. }
  120.  
  121. #### Imaginary literals
  122.  
  123. token imaginary_lit {
  124. [<decimals> | <float_lit>] i
  125. }
  126.  
  127. #### Character literals
  128.  
  129. token char_lit {
  130. "'" ~ "'" [ <unicode_value> | <-[\n\']> ]
  131. }
  132.  
  133. token unicode_value {
  134. | <byte_value>
  135. | <little_u_value>
  136. | <big_u_value>
  137. | <escaped_char>
  138. }
  139.  
  140. token byte_value {
  141. | <octal_byte_value>
  142. | <hex_byte_value>
  143. }
  144.  
  145. token octal_byte_value {
  146. '\\' <.octal_digit> ** 3
  147. }
  148.  
  149. token hex_byte_value {
  150. '\\x' <.hex_digit> ** 2
  151. }
  152.  
  153. token little_u_value {
  154. '\\u' <.hex_digit> ** 4
  155. }
  156.  
  157. token big_u_value {
  158. '\\U' <.hex_digit> ** 8
  159. }
  160.  
  161. token escaped_char {
  162. '\\' [ <[abfnrtv]> | '\\' | "'" | '"' ]
  163. }
  164.  
  165. #### String literals
  166.  
  167. token string_lit {
  168. | <raw_string_lit>
  169. | <interpreted_string_lit>
  170. }
  171.  
  172. token raw_string_lit {
  173. '`' ~ '`' [ <-[\`]> ]*
  174. }
  175.  
  176. token interpreted_string_lit {
  177. '"' ~ '"' [ <.unicode_value> | <-[\n\"]> ]*
  178. }
  179.  
  180. ######################################################################
  181. ## Types
  182.  
  183. rule type {
  184. | <type_lit>
  185. | <type_name>
  186. | '(' <type> ')'
  187. }
  188.  
  189. rule type_name {
  190. <qualified_ident>
  191. }
  192.  
  193. rule type_lit {
  194. | <array_type>
  195. | <struct_type>
  196. | <pointer_type>
  197. | <function_type>
  198. | <interface_type>
  199. | <slice_type>
  200. | <map_type>
  201. | <channel_type>
  202. }
  203.  
  204. #### Array types
  205.  
  206. rule array_type {
  207. '[' <array_length> ']' <element_type>
  208. }
  209.  
  210. rule array_length {
  211. <expression>
  212. }
  213.  
  214. rule element_type {
  215. <type>
  216. }
  217.  
  218. #### Slice types
  219.  
  220. rule slice_type {
  221. '[' ']' <element_type>
  222. }
  223.  
  224. #### Struct types
  225.  
  226. rule struct_type {
  227. struct '{' (<field_decl> <.semi>)* '}'
  228. }
  229.  
  230. rule field_decl {
  231. [<identifier_list> <type> | <anonymous_field>] <tag>?
  232. }
  233.  
  234. rule anonymous_field {
  235. '*'? <type_name>
  236. }
  237.  
  238. rule tag {
  239. <.string_lit>
  240. }
  241.  
  242. #### Pointer types
  243.  
  244. rule pointer_type {
  245. '*' <base_type>
  246. }
  247.  
  248. rule base_type {
  249. <type>
  250. }
  251.  
  252. #### Function types
  253.  
  254. rule function_type {
  255. func <signature>
  256. }
  257.  
  258. rule signature {
  259. <parameters> <result>?
  260. }
  261.  
  262. rule result {
  263. <parameters> | <type>
  264. }
  265.  
  266. rule parameters {
  267. '(' <parameter_list>? ')'
  268. }
  269.  
  270. rule parameter_list {
  271. <parameter_decl>+ % <.com>
  272. }
  273.  
  274. rule parameter_decl {
  275. <identifier_list>? '...'? <type>?
  276. }
  277.  
  278. #### Interface types
  279.  
  280. rule interface_type {
  281. interface '{' (<method_spec> <.semi>)* '}'
  282. }
  283.  
  284. rule method_spec {
  285. | <method_name> <signature>
  286. | <interface_type_name>
  287. }
  288.  
  289. rule method_name {
  290. <identifier>
  291. }
  292.  
  293. rule interface_type_name {
  294. <type_name>
  295. }
  296.  
  297. #### Map types
  298.  
  299. rule map_type {
  300. map '[' <key_type> ']' <element_type>
  301. }
  302.  
  303. rule key_type {
  304. <type>
  305. }
  306.  
  307. #### Channel types
  308.  
  309. rule channel_type {
  310. [
  311. | chan '<-'?
  312. | '<-' chan
  313. ] <element_type>
  314. }
  315.  
  316. #### Blocks
  317. rule block {
  318. '{' (<statement> <.semi>)* '}'
  319. }
  320.  
  321. ######################################################################
  322. ## Declarations and scope
  323.  
  324. rule declaration {
  325. | <const_decl>
  326. | <type_decl>
  327. | <var_decl>
  328. }
  329.  
  330. rule top_level_decl {
  331. | <declaration>
  332. | <function_decl>
  333. | <method_decl>
  334. }
  335.  
  336. #### Constant declarations
  337.  
  338. rule const_decl {
  339. const [<const_spec> | '(' (<const_spec> <.semi>)* ')']
  340. }
  341.  
  342. rule const_spec {
  343. <identifier_list> [<type>? '=' <expression_list>]
  344. }
  345.  
  346. rule identifier_list {
  347. <identifier>+ % <.com>
  348. }
  349.  
  350. rule expression_list {
  351. <expression>+ % <.com>
  352. }
  353.  
  354. #### Type declarations
  355.  
  356. rule type_decl {
  357. type [<type_spec> | '(' (<type_spec> <.semi>)* ')']
  358. }
  359.  
  360. rule type_spec {
  361. <identifier> <type>
  362. }
  363.  
  364. #### Variable declarations
  365.  
  366. rule var_decl {
  367. var [<var_spec> | '(' (<var_spec> <.semi>)* ')']
  368. }
  369.  
  370. rule var_spec {
  371. <identifier_list> <var_expression_list>
  372. }
  373.  
  374. rule var_expression_list {
  375. | '=' <expression_list>
  376. | <type> ['=' <expression_list>]?
  377. }
  378.  
  379. #### Short variable declarations
  380.  
  381. rule short_var_decl {
  382. <identifier_list> ':=' <expression_list>
  383. }
  384.  
  385. #### Function declarations
  386.  
  387. rule function_decl {
  388. func <function_name> <signature> <body>?
  389. }
  390.  
  391. rule function_name {
  392. <identifier>
  393. }
  394.  
  395. rule body {
  396. <block>
  397. }
  398.  
  399. #### Method declarations
  400.  
  401. rule method_decl {
  402. func <receiver> <method_name> <signature> <body>?
  403. }
  404.  
  405. rule receiver {
  406. '(' <identifier>? '*'? <base_type_name> ')'
  407. }
  408.  
  409. rule base_type_name {
  410. <identifier>
  411. }
  412.  
  413. ######################################################################
  414. ## Expressions
  415.  
  416. #### Operands
  417.  
  418. rule operand {
  419. | <literal>
  420. | <qualified_ident>
  421. | <method_expr>
  422. | '(' <expression> ')'
  423. }
  424.  
  425. rule literal {
  426. | <basic_lit>
  427. | <composite_lit>
  428. | <function_lit>
  429. }
  430.  
  431. rule basic_lit {
  432. | <int_lit>
  433. | <float_lit>
  434. | <imaginary_lit>
  435. | <char_lit>
  436. | <string_lit>
  437. }
  438.  
  439. #### Qualified identifiers
  440.  
  441. rule qualified_ident {
  442. | <package_name> '.' <identifier>
  443. | <identifier>
  444. }
  445.  
  446. #### Composite literals
  447.  
  448. rule composite_lit { <literal_type> <!block> <literal_value> }
  449.  
  450. rule literal_type {
  451. | <struct_type>
  452. | <array_type>
  453. | '[...]' <element_type>
  454. | <slice_type>
  455. | <map_type>
  456. | <type_name>
  457. }
  458.  
  459. rule literal_value { '{' (<element>* % <.com>) <.com>? '}' }
  460. rule element { [<key> ':']? <value> }
  461. rule key { <field_name> | <element_index> }
  462. rule field_name { <identifier> }
  463. rule element_index { <expression> }
  464. rule value { <expression> | <literal_value> }
  465.  
  466. #### Function literals
  467.  
  468. rule function_lit {
  469. <function_type> <body>
  470. }
  471.  
  472. #### Primary expressions
  473.  
  474. rule primary_expr {
  475. <primary_subexpr> <secondary_expr>*
  476. }
  477.  
  478. rule primary_subexpr {
  479. | <builtin_call>
  480. | <operand>
  481. | <conversion>
  482. }
  483.  
  484. rule secondary_expr {
  485. | <type_assertion>
  486. | <selector>
  487. | <index>
  488. | <slice>
  489. | <call>
  490. }
  491.  
  492. #### Selectors
  493.  
  494. rule selector {
  495. '.' <identifier>
  496. }
  497.  
  498. #### Indexes
  499.  
  500. rule index {
  501. '[' <expression> ']'
  502. }
  503.  
  504. #### Slices
  505.  
  506. rule slice {
  507. '[' <expression>? ':' <expression>? ']'
  508. }
  509.  
  510. #### Type assertions
  511.  
  512. rule type_assertion {
  513. '.' '(' <type> ')'
  514. }
  515.  
  516. #### Calls
  517.  
  518. rule call {
  519. '(' (<argument_list> <.com>?)? ')'
  520. }
  521.  
  522. rule argument_list {
  523. <expression_list> '...'?
  524. }
  525.  
  526. #### Operators
  527.  
  528. # TODO
  529. rule expression {
  530. # | <unary_expr>
  531. # | <binary_expr>
  532. | <unary_expr> (<binary_op> <unary_expr>)*
  533. }
  534.  
  535. #rule binary_expr {
  536. # <unary_expr> <binary_op> <expression>
  537. # <expression> <binary_op> <unary_expr>
  538. #}
  539.  
  540. rule unary_expr {
  541. | <primary_expr>
  542. | <unary_op> <unary_expr>
  543. }
  544.  
  545. #### Operator precedence
  546.  
  547. rule binary_op {
  548. | '||'
  549. | '&&'
  550. | <mul_op>
  551. | <add_op>
  552. | <rel_op>
  553. }
  554.  
  555. # TODO: when there are no bugs, rewrite these rules to be
  556. # more like add_op, which is more idiomatic, so they say.
  557. # BUG: <https://rt.perl.org/rt3/Public/Bug/Display.html?id=113590>
  558.  
  559. proto token rel_op {*}
  560. token rel_op:sym<eq> { '==' }
  561. token rel_op:sym<ne> { '!=' }
  562. token rel_op:sym<lt> { '<' }
  563. token rel_op:sym<le> { '<=' }
  564. token rel_op:sym<gt> { '>' }
  565. token rel_op:sym<ge> { '>=' }
  566.  
  567. proto token add_op {*}
  568. token add_op:sym<+> { <sym> }
  569. token add_op:sym<-> { <sym> }
  570. token add_op:sym<|> { <sym> }
  571. token add_op:sym<^> { <sym> }
  572.  
  573. proto token mul_op {*}
  574. token mul_op:sym<*> { <sym> }
  575. token mul_op:sym</> { <sym> }
  576. token mul_op:sym<%> { <sym> }
  577. token mul_op:sym<shl> { '<<' }
  578. token mul_op:sym<shr> { '>>' }
  579. token mul_op:sym<&> { <sym> }
  580. token mul_op:sym<&^> { <sym> }
  581.  
  582. proto token unary_op {*}
  583. token unary_op:sym<+> { <sym> }
  584. token unary_op:sym<-> { <sym> }
  585. token unary_op:sym<!> { <sym> }
  586. token unary_op:sym<^> { <sym> }
  587. token unary_op:sym<*> { <sym> }
  588. token unary_op:sym<&> { <sym> }
  589. token unary_op:sym<to> { '<-' }
  590.  
  591. #### Method expressions
  592.  
  593. rule method_expr {
  594. <receiver_type> '.' <method_name>
  595. }
  596.  
  597. rule receiver_type {
  598. | <type_name>
  599. | '(' '*' <type_name> ')'
  600. }
  601.  
  602. #### Conversions
  603.  
  604. rule conversion {
  605. <type> '(' <expression> ')'
  606. }
  607.  
  608. ######################################################################
  609. ## Statements
  610.  
  611. ##rule statement_list { <statement>* % <.semi> }
  612.  
  613. rule statement {
  614. | <block>
  615. | <if_stmt>
  616. | <declaration>
  617. | <keyword_stmt>
  618. | <simple_stmt>
  619. }
  620.  
  621. # BAD: This rule is nonstandard.
  622. # <simple_stmt> is not supposed to match <labeled_stmt>,
  623. # but I don't see a way around this right now.
  624. # This shouldn't cause problems, though, because this
  625. # is more liberal than the standard Go parser.
  626.  
  627. rule simple_stmt {
  628. | <short_var_decl>
  629. | <labeled_stmt>
  630. | <assignment>
  631. | <incdec_stmt>
  632. | <send_stmt>
  633. | <expression_stmt>
  634. | <?>
  635. }
  636.  
  637. # <keyword_stmt> is not in the Go spec
  638. proto rule keyword_stmt {*}
  639.  
  640. #### Empty statements (handled above?)
  641.  
  642. #### Labeled statements
  643.  
  644. rule labeled_stmt { <label> ':' <statement> }
  645. rule label { <identifier> }
  646.  
  647. #### Expression statements
  648.  
  649. rule expression_stmt { <expression> }
  650.  
  651. #### Send statements
  652.  
  653. rule send_stmt { <channel> '<-' <expression> }
  654. rule channel { <expression> }
  655.  
  656. #### IncDec statements
  657.  
  658. rule incdec_stmt {
  659. | <inc_stmt>
  660. | <dec_stmt>
  661. }
  662.  
  663. rule inc_stmt { <expression> '++' }
  664. rule dec_stmt { <expression> '--' }
  665.  
  666. #### Assignments
  667.  
  668. rule assignment {
  669. <expression_list> <assign_op> <expression_list>
  670. }
  671.  
  672. token assign_op {
  673. [ <add_op> | <mul_op> ]? '='
  674. }
  675.  
  676. #### If statements
  677.  
  678. proto rule if_stmt {*}
  679. rule if_stmt:sym<if> {
  680. <sym> <opt_simple_stmt> <expression> <block>
  681. <else_stmt>?
  682. }
  683.  
  684. proto rule else_stmt {*}
  685. rule else_stmt:sym<else> {
  686. <sym> [ <if_stmt> | <block> ]
  687. }
  688.  
  689. rule opt_simple_stmt {
  690. [ [ <simple_stmt> | <?> ] <.semi> ]?
  691. }
  692.  
  693. #### Switch statements
  694. rule keyword_stmt:sym<switch> { <sym> <opt_simple_stmt> [ <type_switch> | <expr_switch> ] }
  695.  
  696. proto rule expr_case {*}
  697. rule expr_case:sym<case> { <sym> <expression_list> }
  698. rule expr_case:sym<default> { <sym> }
  699. rule expr_clause { <exprcase> ':' <statement_list>* }
  700. rule expr_switch {
  701. <expression>? '{' <expr_clause> '}'
  702. }
  703.  
  704. proto rule type_case {*}
  705. rule type_case:sym<case> { <sym> <type_list> }
  706. rule type_case:sym<default> { <sym> }
  707. rule type_clause { <type_case> ':' <statement_list>* }
  708. rule type_guard { [ <identifier> ':=' ]? <primary_expr> '.(type)' }
  709. rule type_list { <type>+ % <.com> }
  710. rule type_switch {
  711. <type_guard> "{" { <type_clause> } "}"
  712. }
  713.  
  714. #### Select statements
  715. rule keyword_stmt:sym<select> { <sym> <comm_select> }
  716.  
  717. proto rule comm_case {*}
  718. rule comm_case:sym<case> { <sym> [ <send_stmt> | <recv_stmt> ] }
  719. rule comm_case:sym<default> { <sym> }
  720. rule expr_assign { <expression> (',' <expression>)? [ '=' | ':=' ]}
  721. rule recv_expr { <expression> }
  722. rule recv_stmt { <expr_assign>? <recv_expr> }
  723. rule comm_clause { <comm_case> ':' <statement_list> }
  724. rule comm_select {
  725. '{' <comm_clause>* '}'
  726. }
  727.  
  728. #### For statements
  729. rule keyword_stmt:sym<for> { <sym> <for_clauses>? <block> }
  730.  
  731. rule for_clauses {
  732. | <for_clause>
  733. | <range_clause>
  734. | <condition>
  735. }
  736.  
  737. rule condition { <expression> }
  738. rule init_stmt { [ <simple_stmt> | <?> ] }
  739. rule post_stmt { [ <simple_stmt> | <?> ] }
  740. rule for_clause { <init_stmt>? ';' <condition>? ';' <post_stmt>? }
  741. rule range_clause { <expr_assign> 'range' <expression> }
  742.  
  743. #### Go statements
  744. rule keyword_stmt:sym<go> { <sym> <expression> }
  745. #### Return statements
  746. rule keyword_stmt:sym<return> { <sym> <expression_list>? }
  747. #### Break statements
  748. rule keyword_stmt:sym<break> { <sym> <label>? }
  749. #### Continue statements
  750. rule keyword_stmt:sym<continue> { <sym> <label>? }
  751. #### Goto statements
  752. rule keyword_stmt:sym<goto> { <sym> <label> }
  753. #### Fallthrough statements
  754. rule keyword_stmt:sym<fallthrough> { <sym> }
  755. #### Defer statements
  756. rule keyword_stmt:sym<defer> { <sym> <expression> }
  757.  
  758. #### Built-in functions
  759.  
  760. rule builtin_call {
  761. <builtin_id> '(' (<builtin_args>* % <.com>) <.com>? ')'
  762. }
  763.  
  764. rule builtin_args {
  765. <type> (',' <expression_list>)?
  766. }
  767. # | <expression_list>
  768.  
  769. token builtin_id {
  770. | make
  771. | new
  772. }
  773.  
  774. ######################################################################
  775. ## Packages
  776.  
  777. #### Source file organization
  778.  
  779. rule source_file {
  780. <package_clause> <.semi>
  781. (<import_decl> <.semi>)*
  782. (<top_level_decl> <.semi>)*
  783. }
  784.  
  785. rule top_level_decls {
  786. [<top_level_decl> <.semi>]*
  787. }
  788.  
  789. #### Package clause
  790. rule package_clause {
  791. package <package_name>
  792. }
  793.  
  794. rule package_name {
  795. <identifier>
  796. }
  797.  
  798. #### Import declarations
  799.  
  800. rule import_decls {
  801. [<import_decl> <.semi>]*
  802. }
  803.  
  804. rule import_decl {
  805. import <import_specs>
  806. }
  807.  
  808. rule import_specs {
  809. | <import_spec>
  810. | '(' [<import_spec> <.semi>]* ')'
  811. }
  812.  
  813. rule import_spec {
  814. ['.' | <package_name>]? <import_path>
  815. }
  816.  
  817. rule import_path {
  818. <.string_lit>
  819. }
  820.  
  821. #rule method_expr {
  822. # <receiver_type> '.' <method_name>
  823. #}
  824. #
  825. #rule receiver_type {
  826. # <type_name> | [ '(' '*' <type_name> ')' ]
  827. #}
  828. #
  829. #rule conversion {
  830. # <type> '(' <expression> ')'
  831. #}
  832. #
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement