Guest User

Untitled

a guest
Apr 24th, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.77 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. using Irony.Parsing;
  6.  
  7. namespace FreeActionScript
  8. {
  9. [Language ("ActionScript", "3.0-", "ActionScript pseudo grammar")]
  10. public class ActionScriptGrammar : Grammar
  11. {
  12. public ActionScriptGrammar ()
  13. {
  14. CommentTerminal single_line_comment = new CommentTerminal ("SingleLineComment", "//", "\r", "\n");
  15. CommentTerminal delimited_comment = new CommentTerminal ("DelimitedComment", "/*", "*/");
  16.  
  17. NonGrammarTerminals.Add (single_line_comment);
  18. NonGrammarTerminals.Add (delimited_comment);
  19.  
  20. // FIXME: should be generic identifiers or its own.
  21. IdentifierTerminal identifier = TerminalFactory.CreateCSharpIdentifier ("Identifier");
  22. identifier.AllFirstChars += "$";
  23. StringLiteral string_literal = TerminalFactory.CreateCSharpString ("StringLiteral");
  24. StringLiteral char_literal = new StringLiteral ("CharLiteral", "'");
  25. NumberLiteral numeric_literal = TerminalFactory.CreateCSharpNumber ("Number");
  26. RegExLiteral regex_literal = new RegExLiteral ("RegEx");
  27. regex_literal.Switches.Add ('s', RegexOptions.None); // FIXME: other than None
  28.  
  29. // keywords
  30. KeyTerm keyword_package = ToTerm ("package");
  31. KeyTerm keyword_import = ToTerm ("import");
  32. KeyTerm keyword_use = ToTerm ("use");
  33. KeyTerm keyword_namespace = ToTerm ("namespace");
  34. KeyTerm keyword_class = ToTerm ("class");
  35. KeyTerm keyword_extends = ToTerm ("extends");
  36. KeyTerm keyword_public = ToTerm ("public");
  37. KeyTerm keyword_internal = ToTerm ("internal");
  38. KeyTerm keyword_private = ToTerm ("private");
  39. KeyTerm keyword_static = ToTerm ("static");
  40. KeyTerm keyword_dynamic = ToTerm ("dynamic");
  41. KeyTerm keyword_override = ToTerm ("override");
  42. KeyTerm keyword_const = ToTerm ("const");
  43. KeyTerm keyword_var = ToTerm ("var");
  44. KeyTerm keyword_function = ToTerm ("function");
  45. KeyTerm keyword_get = ToTerm ("get");
  46. KeyTerm keyword_set = ToTerm ("set");
  47. KeyTerm keyword_throw = ToTerm ("throw");
  48. KeyTerm keyword_try = ToTerm ("try");
  49. KeyTerm keyword_catch = ToTerm ("catch");
  50. KeyTerm keyword_finally = ToTerm ("finally");
  51. KeyTerm keyword_return = ToTerm ("return");
  52. KeyTerm keyword_if = ToTerm ("if");
  53. KeyTerm keyword_else = ToTerm ("else");
  54. KeyTerm keyword_switch = ToTerm ("switch");
  55. KeyTerm keyword_case = ToTerm ("case");
  56. KeyTerm keyword_default = ToTerm ("default");
  57. KeyTerm keyword_while = ToTerm ("while");
  58. KeyTerm keyword_do = ToTerm ("do");
  59. KeyTerm keyword_for = ToTerm ("for");
  60. KeyTerm keyword_each = ToTerm ("each");
  61. KeyTerm keyword_in = ToTerm ("in");
  62. KeyTerm keyword_break = ToTerm ("break");
  63. KeyTerm keyword_continue = ToTerm ("continue");
  64. KeyTerm keyword_null = ToTerm ("null");
  65. KeyTerm keyword_new = ToTerm ("new");
  66. KeyTerm keyword_is = ToTerm ("is");
  67. KeyTerm keyword_as = ToTerm ("as");
  68.  
  69. // operators (copied from CSharpGrammar)
  70.  
  71. /*
  72. RegisterOperators (1, "||");
  73. RegisterOperators (2, "&&");
  74. RegisterOperators (3, "|");
  75. RegisterOperators (5, "&");
  76. RegisterOperators (6, "==", "!=");
  77. RegisterOperators (7, "<", ">", "<=", ">=", "is", "as");
  78. RegisterOperators (8, "<<", ">>");
  79. RegisterOperators (9, "++", "--");
  80. RegisterOperators (10, "+", "-");
  81. RegisterOperators (11, "*", "/", "%");
  82. RegisterOperators (12, ".");
  83. */
  84.  
  85. var compile_unit = new NonTerminal ("compile_unit");
  86. var package_decls = new NonTerminal ("package_declarations");
  87. var package_decl = new NonTerminal ("package_declaration");
  88. var package_name = new NonTerminal ("package_name");
  89. var package_contents = new NonTerminal ("package_contents");
  90. var namespace_decl = new NonTerminal ("namespace_declaration");
  91. var import = new NonTerminal ("import");
  92. var namespace_uses = new NonTerminal ("namespace_uses");
  93. var namespace_use = new NonTerminal ("namespace_use");
  94. var type_name_wild = new NonTerminal ("type_name_wild");
  95. var class_decl = new NonTerminal ("class_declaration");
  96. var access_modifier = new NonTerminal ("access_modifier");
  97. var opt_extends = new NonTerminal ("opt_extends");
  98. var class_members = new NonTerminal ("class_members");
  99. var class_member = new NonTerminal ("class_member");
  100. var member_header = new NonTerminal ("member_header");
  101. var constant_declaration = new NonTerminal ("constant_declaration");
  102. var field_declaration = new NonTerminal ("field_declaration");
  103. var property_function = new NonTerminal ("property_function");
  104. var property_getter = new NonTerminal ("property_getter");
  105. var property_setter = new NonTerminal ("property_setter");
  106. var general_function = new NonTerminal ("general_function");
  107. var general_function_headless = new NonTerminal ("general_function_headless");
  108. var function_nameless = new NonTerminal ("function_nameless");
  109. var constructor = new NonTerminal ("constructor");
  110. var argument_decls = new NonTerminal ("argument_declarations");
  111. var varargs_decl = new NonTerminal ("varargs_decl");
  112. var named_argument_decls = new NonTerminal ("named_argument_declarations");
  113. var argument_decl = new NonTerminal ("argument_declaration");
  114. var argument_type = new NonTerminal ("argument_type");
  115. var qualified_reference = new NonTerminal ("qualified_reference");
  116. var type_name = qualified_reference;//new NonTerminal ("type_name");
  117. var member_reference = new NonTerminal ("member_reference");
  118. var assignment_opt = new NonTerminal ("assignment_opt");
  119. var lvalue = new NonTerminal ("lvalue");
  120. var function_body = new NonTerminal ("function_body");
  121. var statements = new NonTerminal ("statements");
  122. var statement = new NonTerminal ("statement");
  123. var statement_lacking_colon = new NonTerminal ("statement_lacking_colon");
  124.  
  125. var local_function_declaration = new NonTerminal ("local_function_declaration");
  126. var assign_statement = new NonTerminal ("assign_statement");
  127. var calc_assign_statement = new NonTerminal ("calc_assign_statement");
  128. var return_statement = new NonTerminal ("return_statement");
  129. var function_call_statement = new NonTerminal ("function_call_statement");
  130. var call_arguments = new NonTerminal ("call_arguments");
  131. var call_argument = new NonTerminal ("call_argument");
  132. var local_var_decl_statement = new NonTerminal ("local_var_decl_statement");
  133. var name_value_pairs = new NonTerminal ("name_value_pairs");
  134. var name_value_pair = new NonTerminal ("name_value_pair");
  135. var if_statement = new NonTerminal ("if_statement");
  136. var else_block = new NonTerminal ("else_block");
  137. var switch_statement = new NonTerminal ("switch_statement");
  138. var switch_cond_blocks = new NonTerminal ("switch_conditional_blocks");
  139. var switch_cond_block = new NonTerminal ("switch_cond_block");
  140. var condition_label = new NonTerminal ("condition_label");
  141. var while_statement = new NonTerminal ("while_statement");
  142. var do_while_statement = new NonTerminal ("do_while_statement");
  143. var for_statement = new NonTerminal ("for_statement");
  144. var for_statement_remaining = new NonTerminal ("for_statement_remaining");
  145. var for_c_style_statement = new NonTerminal ("for_c_style_statement");
  146. var for_in_statement = new NonTerminal ("for_in_statement");
  147. var for_initializers = new NonTerminal ("for_initializers");
  148. var for_assign_statements = new NonTerminal ("for_assign_statements");
  149. var for_iterators = new NonTerminal ("for_iterators");
  150. var for_iterator = new NonTerminal ("for_iterator");
  151. var for_each_statement = new NonTerminal ("for_each_statement");
  152. var for_each_iterator = new NonTerminal ("for_each_iterator");
  153. var break_statement = new NonTerminal ("break_statement");
  154. var continue_statement = new NonTerminal ("continue_statement");
  155. var throw_statement = new NonTerminal ("throw_statement");
  156. var try_statement = new NonTerminal ("try_statement");
  157. var try_block = new NonTerminal ("try_block");
  158. var catch_block = new NonTerminal ("catch_block");
  159. var exception_type_part = new NonTerminal ("exception_type_part");
  160. var finally_block = new NonTerminal ("finally_block");
  161. var block_statement = new NonTerminal ("block_statement");
  162.  
  163. var expression = new NonTerminal ("expression");
  164. var assignment_expression = new NonTerminal ("assignment_expression");
  165. var conditional_expression = new NonTerminal ("conditional_expression");
  166. var or_expression = new NonTerminal ("or_expression");
  167. var and_expression = new NonTerminal ("and_expression");
  168. var equality_expression = new NonTerminal ("equality_expression");
  169. var relational_expression = new NonTerminal ("relational_expression");
  170. var additive_expression = new NonTerminal ("additive_expression");
  171. var multiplicative_expression = new NonTerminal ("multiplicative_expression");
  172. var shift_expression = new NonTerminal ("shift_expression");
  173. var unary_expression = new NonTerminal ("unary_expression");
  174. var inc_dec_expression = new NonTerminal ("inc_dec_expression");
  175. var union_expression = new NonTerminal ("union_expression");
  176. var iteration_expression = new NonTerminal ("iteration_expression");
  177. var array_access_expression = new NonTerminal ("array_access_expression");
  178. var primary_expression = new NonTerminal ("primary_expression");
  179. var function_call_expression = new NonTerminal ("function_call_expression");
  180. var member_reference_expression = new NonTerminal ("member_reference_expression");
  181. var field_reference_expression = new NonTerminal ("field_reference_expression");
  182. var new_object_expression = new NonTerminal ("new_object_expression");
  183. var literal_array_expression = new NonTerminal ("literal_array_expression");
  184. var array_items = new NonTerminal ("array_items");
  185. var literal_hash_expression = new NonTerminal ("literal_hash_expression");
  186. var hash_items = new NonTerminal ("hash_items");
  187. var hash_item = new NonTerminal ("hash_item");
  188. var as_expression = new NonTerminal ("as_expression");
  189. var embedded_function_expression = new NonTerminal ("embedded_function_expression");
  190. var literal = new NonTerminal ("literal");
  191.  
  192. // non-terminals
  193.  
  194. this.Root = compile_unit;
  195.  
  196. compile_unit.Rule = MakeStarRule (compile_unit, null, (package_decl | import | class_decl));
  197. package_decl.Rule = keyword_package + package_name + "{" + package_contents + "}";
  198. package_name.Rule = qualified_reference;
  199. package_contents.Rule = MakeStarRule (package_contents, null, import | member_header + (namespace_decl | class_decl));
  200. namespace_decl.Rule = keyword_namespace + identifier + ";";
  201.  
  202. import.Rule = keyword_import + type_name_wild + ";" + ReduceHere ();
  203. namespace_uses.Rule = MakeStarRule (namespace_uses, null, namespace_use);
  204. namespace_use.Rule = keyword_use + keyword_namespace + identifier + ";" + ReduceHere ();
  205.  
  206. class_decl.Rule = keyword_class + identifier + opt_extends + "{" + namespace_uses + class_members + "}" + ReduceHere ();
  207. opt_extends.Rule = Empty | keyword_extends + identifier;
  208.  
  209. // class member
  210. access_modifier.Rule = keyword_public | keyword_internal | keyword_private | identifier;
  211. class_members.Rule = MakeStarRule (class_members, null, class_member);
  212. class_member.Rule = constant_declaration | field_declaration | property_function | general_function | constructor ;
  213.  
  214. member_header.Rule = MakeStarRule (member_header, null, Empty | keyword_static | keyword_dynamic | keyword_override | access_modifier);
  215.  
  216. // field and constant
  217. constant_declaration.Rule = member_header + keyword_const + identifier + ":" + type_name + "=" + expression + (Empty | ";");
  218. field_declaration.Rule = member_header + keyword_var + name_value_pairs + (Empty | ";");
  219. assignment_opt.Rule = Empty | "=" + expression;
  220.  
  221. // functions
  222. property_function.Rule = property_getter | property_setter;
  223. property_getter.Rule = member_header + keyword_function + keyword_get + identifier + "(" + ")" + ":" + type_name + "{" + function_body + "}";
  224. property_setter.Rule = member_header + keyword_function + keyword_set + identifier + "(" + identifier + ":" + type_name + ")" + ":" + "void" + "{" + function_body + "}";
  225. function_body.Rule = statements;
  226. general_function.Rule = member_header + general_function_headless;
  227. general_function_headless.Rule = keyword_function + identifier + function_nameless;
  228. function_nameless.Rule = "(" + argument_decls + ")" + (Empty | ":" + type_name_wild) + "{" + function_body + "}";
  229. constructor.Rule = keyword_function + identifier + "(" + argument_decls + ")" + "{" + function_body + "}";
  230. argument_decls.Rule = MakeStarRule (named_argument_decls, ToTerm (","), argument_decl);
  231. argument_decl.Rule = // FIXME: there is an ambiguation issue; on foo.<bar>=baz ">=" conflicts with comparison operator.
  232. identifier + ":" + argument_type + assignment_opt
  233. | varargs_decl
  234. ;
  235. varargs_decl.Rule = "..." + identifier;
  236. argument_type.Rule = type_name_wild;
  237.  
  238. // statements
  239. statements.Rule = MakeStarRule (statements, null, statement);
  240. statement.Rule =
  241. statement_lacking_colon + ";"
  242. | if_statement
  243. | switch_statement
  244. | while_statement
  245. | do_while_statement
  246. | for_statement
  247. | for_each_statement
  248. | block_statement
  249. | try_statement
  250. | local_function_declaration
  251. ;
  252.  
  253. local_function_declaration.Rule = general_function_headless;
  254.  
  255. statement_lacking_colon.Rule =
  256. assign_statement
  257. | calc_assign_statement
  258. | return_statement
  259. | function_call_statement
  260. | local_var_decl_statement
  261. | break_statement
  262. | continue_statement
  263. | throw_statement
  264. ;
  265.  
  266. assign_statement.Rule = assignment_expression;
  267. calc_assign_statement.Rule =
  268. inc_dec_expression
  269. | lvalue + "+=" + expression
  270. | lvalue + "-=" + expression
  271. | lvalue + "*=" + expression
  272. | lvalue + "/=" + expression
  273. | lvalue + "%=" + expression
  274. | lvalue + "&=" + expression
  275. | lvalue + "|=" + expression
  276. | lvalue + "<<=" + expression
  277. | lvalue + ">>=" + expression
  278. ;
  279. return_statement.Rule =
  280. keyword_return
  281. | keyword_return + expression;
  282. function_call_statement.Rule = function_call_expression;
  283. if_statement.Rule =
  284. keyword_if + "(" + expression + ")" + statement + else_block;
  285. else_block.Rule = Empty | PreferShiftHere () + keyword_else + statement;
  286. switch_statement.Rule =
  287. keyword_switch + "(" + expression + ")" + "{" + switch_cond_blocks + "}";
  288. switch_cond_blocks.Rule = MakeStarRule (switch_cond_blocks, null, switch_cond_block);
  289. switch_cond_block.Rule = condition_label + ":" + statements;
  290. condition_label.Rule =
  291. keyword_case + literal
  292. | keyword_case + qualified_reference // identifier, or constant
  293. | keyword_default;
  294. while_statement.Rule = keyword_while + "(" + expression + ")" + statement;
  295. do_while_statement.Rule = keyword_do + statement + keyword_while + "(" + expression + ")" + ";";
  296. for_statement.Rule = keyword_for + "(" + for_statement_remaining;
  297. for_statement_remaining.Rule = for_c_style_statement | for_in_statement;
  298. for_c_style_statement.Rule = for_initializers + ";" + expression + ";" + for_iterators + ")" + statement;
  299. for_in_statement.Rule = for_each_iterator + keyword_in + expression + ")" + statement;
  300. for_initializers.Rule = local_var_decl_statement | for_assign_statements | identifier;
  301. for_assign_statements.Rule = MakeStarRule (for_assign_statements, ToTerm (","), assign_statement);
  302. for_iterators.Rule = MakeStarRule (for_iterators, ToTerm (","), for_iterator);
  303. for_iterator.Rule = assign_statement | calc_assign_statement;
  304. for_each_statement.Rule = keyword_for + keyword_each + "(" + for_each_iterator + keyword_in + expression + ")" + statement;
  305. for_each_iterator.Rule = identifier | keyword_var + identifier + ":" + argument_type;
  306. break_statement.Rule = keyword_break;
  307. continue_statement.Rule = keyword_continue;
  308. throw_statement.Rule = keyword_throw + expression;
  309. try_statement.Rule = try_block + catch_block + finally_block;
  310. try_block.Rule = keyword_try + "{" + statements + "}";
  311. catch_block.Rule = keyword_catch + exception_type_part + "{" + statements + "}";
  312. exception_type_part.Rule = Empty | ToTerm ("(") + identifier + ":" + type_name + ")";
  313. finally_block.Rule = Empty | keyword_finally + "{" + statements + "}";
  314. block_statement.Rule = ToTerm ("{") + statements + "}";
  315. local_var_decl_statement.Rule = keyword_var + name_value_pairs;
  316. name_value_pairs.Rule = MakePlusRule (name_value_pairs, ToTerm (","), name_value_pair);
  317. name_value_pair.Rule = identifier + ":" + argument_type + assignment_opt;
  318.  
  319. // expressions
  320. expression.Rule =
  321. conditional_expression
  322. | assignment_expression;
  323.  
  324. assignment_expression.Rule =
  325. lvalue + "=" + expression
  326. | lvalue + "=" + assignment_expression
  327. ;
  328.  
  329. conditional_expression.Rule =
  330. or_expression
  331. | or_expression + "?" + conditional_expression + ":" + conditional_expression;
  332. or_expression.Rule =
  333. and_expression
  334. | or_expression + "||" + and_expression;
  335. and_expression.Rule =
  336. equality_expression
  337. | and_expression + "&&" + equality_expression;
  338. equality_expression.Rule =
  339. relational_expression
  340. | equality_expression + "===" + relational_expression
  341. | equality_expression + "!==" + relational_expression
  342. | equality_expression + "==" + relational_expression
  343. | equality_expression + "!=" + relational_expression
  344. | equality_expression + keyword_is + relational_expression;
  345. relational_expression.Rule =
  346. additive_expression
  347. | relational_expression + "<" + additive_expression
  348. | relational_expression + "<=" + additive_expression
  349. | relational_expression + ">" + additive_expression
  350. | relational_expression + ">=" + additive_expression;
  351. additive_expression.Rule =
  352. multiplicative_expression
  353. | additive_expression + "+" + multiplicative_expression
  354. | additive_expression + "-" + multiplicative_expression;
  355. multiplicative_expression.Rule =
  356. as_expression
  357. | multiplicative_expression + "*" + as_expression
  358. | multiplicative_expression + "/" + as_expression
  359. | multiplicative_expression + "%" + as_expression;
  360. as_expression.Rule =
  361. shift_expression
  362. | shift_expression + keyword_as + type_name;
  363. shift_expression.Rule =
  364. union_expression
  365. | shift_expression + "<<<" + union_expression
  366. | shift_expression + "<<" + union_expression
  367. | shift_expression + ">>>" + union_expression
  368. | shift_expression + ">>" + union_expression;
  369. union_expression.Rule =
  370. unary_expression
  371. | union_expression + "&" + unary_expression
  372. | union_expression + "|" + unary_expression
  373. | union_expression + "^" + unary_expression;
  374. unary_expression.Rule =
  375. iteration_expression
  376. | inc_dec_expression
  377. | ToTerm ("-") + iteration_expression
  378. | ToTerm ("!") + iteration_expression;
  379. inc_dec_expression.Rule =
  380. member_reference_expression + ToTerm ("++")
  381. | member_reference_expression + ToTerm ("--")
  382. | ToTerm ("++") + member_reference_expression
  383. | ToTerm ("--") + member_reference_expression;
  384.  
  385. iteration_expression.Rule = // weird, but "!x in y" is parsed as "!(x in y)"
  386. array_access_expression
  387. | literal_hash_expression
  388. | array_access_expression + keyword_in + array_access_expression;
  389.  
  390. array_access_expression.Rule =
  391. primary_expression
  392. | array_access_expression + "[" + expression + "]"
  393. ;
  394.  
  395. primary_expression.Rule =
  396. member_reference_expression
  397. | function_call_expression
  398. | ToTerm ("(") + expression + ")"
  399. | new_object_expression
  400. | literal_array_expression
  401. | literal
  402. | embedded_function_expression;
  403.  
  404. lvalue.Rule =
  405. member_reference_expression
  406. ;
  407.  
  408. literal.Rule = numeric_literal | string_literal | char_literal | regex_literal | keyword_null;
  409.  
  410. member_reference_expression.Rule =
  411. field_reference_expression
  412. // This is required for lvalue.
  413. | member_reference_expression + "[" + expression + "]";
  414.  
  415. field_reference_expression.Rule = member_reference;
  416. function_call_expression.Rule = member_reference_expression + "(" + call_arguments + ")";
  417. call_arguments.Rule = MakeStarRule (call_arguments, ToTerm (","), call_argument);
  418. call_argument.Rule = expression;
  419. member_reference.Rule =
  420. identifier // FIXME: what should I do here? unify with qualified_reference? but some requires expression
  421. | primary_expression + "." + identifier
  422. | primary_expression + "::" + identifier
  423. | primary_expression + ".<" + type_name + ">"
  424. ;
  425.  
  426. new_object_expression.Rule = keyword_new + type_name + "(" + call_arguments + ")";
  427. literal_array_expression.Rule = ToTerm ("[") + array_items + "]";
  428. array_items.Rule = MakeStarRule (array_items, ToTerm (","), expression);
  429. literal_hash_expression.Rule = ToTerm ("{") + hash_items + "}";
  430. hash_items.Rule = MakeStarRule (hash_items, ToTerm (","), hash_item);
  431. hash_item.Rule = (identifier | literal) + ":" + expression;
  432. embedded_function_expression.Rule = keyword_function + function_nameless;
  433.  
  434. // this contains both type name (which includes generic) and member reference, but it's easier to treat them as identical.
  435. qualified_reference.Rule =
  436. identifier
  437. | qualified_reference + "." + identifier
  438. | qualified_reference + ".<" + type_name + ">";
  439.  
  440. type_name_wild.Rule = qualified_reference | qualified_reference + ".*" | "*";
  441. //type_name.Rule = qualified_reference;
  442.  
  443. }
  444. }
  445. }
Add Comment
Please, Sign In to add comment