Advertisement
Guest User

go

a guest
Jun 7th, 2012
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.95 KB | None | 0 0
  1. grammar Go::Grammar;
  2.  
  3. token TOP {
  4. ^ <literal>
  5. [ $ || <.panic: "Syntax error"> ]
  6. }
  7.  
  8. token ws {
  9. \s
  10. }
  11.  
  12. ######################################################################
  13. ## Lexical elements
  14.  
  15. #### Characters
  16.  
  17. regex unicode_letter {
  18. <.alpha>
  19. }
  20.  
  21. regex unicode_digit {
  22. <.digit>
  23. }
  24.  
  25. #### Letters and digits
  26.  
  27. regex letter {
  28. <unicode_letter> | '_'
  29. }
  30.  
  31. regex decimal_digit {
  32. <.digit>
  33. }
  34.  
  35. regex octal_digit {
  36. <[0..7]>
  37. }
  38.  
  39. regex hex_digit {
  40. <.xdigit>
  41. }
  42.  
  43. #### Comments
  44. #### Semicolons
  45. #### Identifiers
  46.  
  47. token identifier {
  48. <letter> [<letter> | <unicode_digit>]*
  49. }
  50.  
  51. #### Keywords
  52. #### Operators and Delimiters
  53. #### Integer literals
  54.  
  55. token int_lit {
  56. | <decimal_lit>
  57. | <octal_lit>
  58. | <hex_lit>
  59. }
  60.  
  61. token decimal_lit {
  62. <[1..9]> <.decimal_digit>*
  63. }
  64.  
  65. token octal_lit {
  66. 0 <.octal_digit>*
  67. }
  68.  
  69. token hex_lit {
  70. 0x <.hex_digit>+
  71. }
  72.  
  73. #### Floating-point literals
  74. #### Imaginary literals
  75. #### Character literals
  76. #### String literalsConst
  77. #### Constants
  78.  
  79. ######################################################################
  80. ## Types
  81.  
  82. #### Method sets
  83. #### Boolean types
  84. #### Numeric types
  85. #### String types
  86. #### Array types
  87. #### Slice types
  88. #### Struct types
  89. #### Pointer types
  90. #### Function types
  91. #### Interface types
  92. #### Map types
  93. #### Channel types
  94. #### Properties of types and values
  95. #### Blocks
  96.  
  97. ######################################################################
  98. ## Declarations and scope
  99.  
  100. rule declaration {
  101. | <const_decl>
  102. | <type_decl>
  103. | <var_decl>
  104. }
  105.  
  106. rule top_level_decl {
  107. | <declaration>
  108. | <function_decl>
  109. | <method_decl>
  110. }
  111.  
  112. #### Constant declarations
  113.  
  114. rule const_decl {
  115. const [<const_spec> | '(' [<const_spec> <.semi>]* ')']
  116. }
  117.  
  118. rule const_spec {
  119. <identifier_list> [<type>? '=' <expression_list>]
  120. }
  121.  
  122. rule identifier_list {
  123. <identifier>+ % ','
  124. }
  125.  
  126. rule expression_list {
  127. <expression>+ % ','
  128. }
  129.  
  130. #### Type declarations
  131. #### Variable declarations
  132.  
  133. ######################################################################
  134. ## Expressions
  135.  
  136. ######################################################################
  137. ## Statements
  138.  
  139. rule statement_list { [ <statement> | <?> ] ** ';' }
  140.  
  141. rule statement {
  142. # | <declaration>
  143. # | <labeled_stmt>
  144. | <simple_stmt>
  145. # | <keyword_stmt>
  146. # | <if_stmt>
  147. | <block>
  148. }
  149.  
  150. rule simple_stmt {
  151. | <expression_stmt>
  152. # | <send_stmt>
  153. | <incdec_stmt>
  154. | <assignment>
  155. | <short_var_decl>
  156. }
  157.  
  158.  
  159. ######################################################################
  160. ## Packages
  161.  
  162. rule expression_list { [ <statement> | <?> ] ** ';' }
  163.  
  164. rule expression {
  165. | <unary_expr>
  166. | <binary_expr>
  167. }
  168.  
  169. rule binary_expr {
  170. <expression> <binary_op> <unary_expr>
  171. }
  172.  
  173. rule unary_expr {
  174. | <primary_expr>
  175. | <unary_op> <unary_expr>
  176. }
  177.  
  178. rule method_expr {
  179. <receiver_type> '.' <method_name>
  180. }
  181.  
  182. rule receiver_type {
  183. <type_name> | [ '(' '*' <type_name> ')' ]
  184. }
  185.  
  186. rule conversion {
  187. <type> '(' <expression> ')'
  188. }
  189.  
  190. rule operand {
  191. | <literal>
  192. | <qualified_ident>
  193. | <method_expr>
  194. | '(' <expression> ')'
  195. }
  196.  
  197. rule literal {
  198. | <basic_lit>
  199. | <composite_lit>
  200. | <function_lit>
  201. }
  202.  
  203. rule basic_lit {
  204. | <int_lit>
  205. | <float_lit>
  206. | <imaginary_lit>
  207. | <char_lit>
  208. | <string_lit>
  209. }
  210.  
  211. rule composite_lit { <literal_type> <literal_value> }
  212.  
  213. rule literal_type {
  214. | <struct_type>
  215. | <array_type>
  216. | '[...]' <element_type>
  217. | <slice_type>
  218. | <map_type>
  219. | <type_name>
  220. }
  221.  
  222. rule literal_value { '{' ~ '}' [ <element> ** ',' ] ','? }
  223. rule element { [ <key> ':' ]? <value> }
  224. rule key { <field_name> | <element_index> }
  225. rule field_name { <identifier> }
  226. rule element_index { <expression> }
  227. rule value { <expression> | <literal_value> }
  228.  
  229.  
  230. rule opt_simple_stmt {
  231. [ [ <simple_stmt> | <?> ] ';' ]?
  232. }
  233.  
  234. proto rule if_stmt {*}
  235. rule if_stmt:sym<if> {
  236. <sym> <opt_simple_stmt> <expression> <block>
  237. <else_stmt>?
  238. }
  239.  
  240. proto rule else_stmt {*}
  241. rule else_stmt:sym<else> {
  242. <sym> [ <if_stmt> | <block> ]
  243. }
  244.  
  245. rule labeled_stmt { <label> ':' <statement> }
  246. rule label { <identifier> }
  247. rule expression_stmt { <expression> }
  248. rule send_stmt { <channel> '<-' <expression> }
  249. rule channel { <expression> }
  250.  
  251. proto rule keyword_stmt {*}
  252. rule keyword_stmt:sym<go> { <sym> <expression> }
  253. rule keyword_stmt:sym<return> { <sym> <expression_list>? }
  254. rule keyword_stmt:sym<break> { <sym> <label>? }
  255. rule keyword_stmt:sym<continue> { <sym> <label>? }
  256. rule keyword_stmt:sym<goto> { <sym> <label> }
  257. rule keyword_stmt:sym<fallthrough> { <sym> }
  258. rule keyword_stmt:sym<switch> { <sym> <opt_simple_stmt> [ <type_switch> | <expr_switch> ] }
  259. rule keyword_stmt:sym<select> { <sym> <comm_select> }
  260. rule keyword_stmt:sym<for> { <sym> [ <condition> | <for_clause> | <range_clause> ] <block> }
  261. rule keyword_stmt:sym<defer> { <sym> <expression> }
  262.  
  263. rule condition { <expression> }
  264. rule init_stmt { [ <simple_stmt> | <?> ] }
  265. rule post_stmt { [ <simple_stmt> | <?> ] }
  266. rule for_clause { <init_stmt>? ';' <condition>? ';' <post_stmt>? }
  267. rule range_clause { <expr_assign> 'range' <expression> }
  268.  
  269. proto rule expr_case {*}
  270. rule expr_case:sym<case> { <sym> <expression_list> }
  271. rule expr_case:sym<default> { <sym> }
  272. rule expr_clause { <exprcase> ':' <statement_list>* }
  273. rule expr_switch {
  274. <expression>? '{' <expr_clause> '}'
  275. }
  276.  
  277. proto rule type_case {*}
  278. rule type_case:sym<case> { <sym> <type_list> }
  279. rule type_case:sym<default> { <sym> }
  280. rule type_clause { <type_case> ':' <statement_list>* }
  281. rule type_guard { [ <identifier> ':=' ]? <primary_expr> '.(type)' }
  282. rule type_list { <type> ** ',' }
  283. rule type_switch {
  284. <type_guard> "{" { <type_clause> } "}"
  285. }
  286.  
  287. proto rule comm_case {*}
  288. rule comm_case:sym<case> { <sym> [ <send_stmt> | <recv_stmt> ] }
  289. rule comm_case:sym<default> { <sym> }
  290. rule expr_assign { <expression> [ ',' <expression> ]? [ '=' | ':=' ]}
  291. rule recv_expr { <expression> }
  292. rule recv_stmt { <expr_assign>? <recv_expr> }
  293. rule comm_clause { <comm_case> ':' <statement_list> }
  294. rule comm_select {
  295. '{' <comm_clause>* '}'
  296. }
  297.  
  298.  
  299. rule incdec_stmt {
  300. | <inc_stmt>
  301. | <dec_stmt>
  302. }
  303.  
  304. rule inc_stmt { <expression> '++' }
  305. rule dec_stmt { <expression> '--' }
  306.  
  307. rule assignment {
  308. <expr_list> <assign_op> <expr_list>
  309. }
  310.  
  311. #token assign_op is infix { [ <add_op> | <mul_op> ] '=' }
  312. #
  313. #proto token binary_op is infix {*}
  314. #
  315.  
  316. proto token rel_op {*}
  317. token rel_op:sym<==> { <sym> }
  318. token rel_op:sym<!=> { <sym> }
  319. token rel_op:sym«<» { <sym> }
  320. token rel_op:sym«<=» { <sym> }
  321. token rel_op:sym«>» { <sym> }
  322. token rel_op:sym«>=» { <sym> }
  323.  
  324. proto token add_op {*}
  325. token add_op:sym<+> { <sym> }
  326. token add_op:sym<-> { <sym> }
  327. token add_op:sym<|> { <sym> }
  328. token add_op:sym<^> { <sym> }
  329.  
  330. proto token mul_op {*}
  331. token mul_op:sym<*> { <sym> }
  332. token mul_op:sym</> { <sym> }
  333. token mul_op:sym<%> { <sym> }
  334. token mul_op:sym«<<» { <sym> }
  335. token mul_op:sym«>>» { <sym> }
  336. token mul_op:sym<&> { <sym> }
  337. token mul_op:sym<&^> { <sym> }
  338.  
  339. proto token unary_op {*}
  340. token unary_op:sym<+> { <sym> }
  341. token unary_op:sym<-> { <sym> }
  342. token unary_op:sym<!> { <sym> }
  343. token unary_op:sym<^> { <sym> }
  344. token unary_op:sym<*> { <sym> }
  345. token unary_op:sym<&> { <sym> }
  346. token unary_op:sym«<-» { <sym> }
  347.  
  348. #proto token statement_control { <...> }
  349. #rule statement_control:sym<say> { <sym> [ <EXPR> ] ** ',' }
  350. #rule statement_control:sym<print> { <sym> [ <EXPR> ] ** ',' }
  351.  
  352. ## Terms
  353.  
  354. #token term:sym<integer> { <integer> }
  355. #token term:sym<quote> { <quote> }
  356.  
  357. #proto token quote { <...> }
  358. #token quote:sym<'> { <?[']> <quote_EXPR: ':q'> }
  359. #token quote:sym<"> { <?["]> <quote_EXPR: ':qq'> }
  360.  
  361. ## Operators
  362.  
  363. #INIT {
  364. # Go::Grammar.O(':prec<u>, :assoc<left>', '%multiplicative');
  365. # Go::Grammar.O(':prec<t>, :assoc<left>', '%additive');
  366. #}
  367.  
  368. #token circumfix:sym<( )> { '(' <.ws> <EXPR> ')' }
  369. #
  370. #token infix:sym<*> { <sym> <O('%multiplicative, :pirop<mul>')> }
  371. #token infix:sym</> { <sym> <O('%multiplicative, :pirop<div>')> }
  372. #
  373. #token infix:sym<+> { <sym> <O('%additive, :pirop<add>')> }
  374. #token infix:sym<-> { <sym> <O('%additive, :pirop<sub>')> }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement