Advertisement
Guest User

Untitled

a guest
May 28th, 2017
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.49 KB | None | 0 0
  1. Helpers
  2.  
  3. all = [0 .. 0xFFFF];
  4. sp = ' ';
  5. newline = 0x000a;
  6. cr = 0x000d;
  7. ff = 0x000c;
  8. ht = 0x0009;
  9. line_terminator = newline | cr | cr newline;
  10. white_space = (sp | ht | ff | line_terminator)*;
  11.  
  12. //newline = 10;
  13. //cr = 13;
  14. //space = ' ';
  15. //tab = 9;
  16. //all = [0 .. 0xFFFF];
  17. eol = cr newline | cr | newline;
  18. not_cr_lf = [all - [cr + newline]];
  19.  
  20. and = 'and';
  21. if = 'if';
  22. char = 'char';
  23. div = 'div';
  24. do = 'do';
  25. else = 'else';
  26. fun = 'fun';
  27. int = 'int';
  28. mod = 'mod';
  29. not = 'not';
  30. nothing = 'nothing';
  31. or = 'or';
  32. ref = 'ref';
  33. return = 'return';
  34. then = 'then';
  35. var = 'var';
  36. while = 'while';
  37. andor = and | or;
  38.  
  39. plus = '+';
  40. minus = '-';
  41. times = '*';
  42. over = '/';
  43. backs = '\';
  44. semicolon = ';';
  45. lparen = '(';
  46. rparen = ')';
  47. aut = ''';
  48. daut = '"';
  49. ques = '?';
  50. excl = '!';
  51. hashtag = '#';
  52. equal = '=';
  53. sm = '<';
  54. big = '>';
  55. sme = '<=';
  56. bige = '>=';
  57. lsbr = '[';
  58. rsbr = ']';
  59. lbr = '{';
  60. rbr = '}';
  61. com = ',';
  62. colon = ':';
  63. ass = '<-';
  64. dollar = '$';
  65.  
  66. letter = ['a'..'z'] | ['A'..'Z'];
  67. num = ['0'..'9'];
  68. alnum = letter | num | '_';
  69. hex_num = num | ['a'..'f'] | ['A'..'F'] ;
  70. stat = aut aut | ''' letter ''' | ''' num ''' | aut '\''n' aut | aut '\''t' aut | aut '\''r' aut |
  71. aut '\''0' aut | aut '\''\' aut | aut '\'''' aut | aut '\''"' aut | aut '\''x'hex_num hex_num aut ;
  72.  
  73. escape_sequencies = '\''n' | '\''t' | '\''r' | '\''0' | '\''\' | '\'''' | '\''"' | '\''x'hex_num hex_num ;
  74. char_str = [all - '"'];
  75. char_str1 = [char_str - '+'];
  76. char_str2 = [char_str - '='];
  77. string_literal = '"' (letter | num | escape_sequencies | white_space | char_str2 )+ '"';
  78. comment1 = dollar not_cr_lf* eol;
  79. t1 = [all - '$'];
  80. comment2 = (dollar dollar ( all? t1 )* dollar dollar) |
  81. (dollar dollar string_literal* dollar dollar);
  82. double_dollar = dollar dollar;
  83.  
  84. Tokens
  85.  
  86. and = and;
  87. if = if;
  88. char = char;
  89. div = div;
  90. do = do;
  91. else = else;
  92. fun = fun;
  93. int = int;
  94. mod = mod;
  95. not = not;
  96. nothing = nothing;
  97. or = or;
  98. ref = ref;
  99. return = return;
  100. then = then;
  101. var = var;
  102. while = while;
  103.  
  104. plus = plus;
  105. minus = minus;
  106. times = times;
  107. over = over;
  108. backs = backs;
  109. semicolon = semicolon;
  110. lparen = lparen;
  111. rparen = rparen;
  112. aut = aut;
  113. daut = daut;
  114. ques = ques;
  115. excl = excl;
  116. hashtag = hashtag;
  117. equal = equal;
  118. sm = sm;
  119. big = big;
  120. sme = sme;
  121. bige = bige;
  122. lsbr = lsbr;
  123. rsbr = rsbr;
  124. lbr = lbr;
  125. rbr = rbr;
  126. com = com;
  127. colon = colon;
  128. ass = ass;
  129. dollar = dollar;
  130.  
  131. //letter = letter;
  132. id = letter alnum*;
  133. int_const = num+;
  134. erroneous_number = (num)+ (letter|'_')+;
  135. char_const = stat;
  136. string_literal = string_literal;
  137. compsymbols = equal | hashtag | sm | big | sme | bige;
  138. calc = plus | minus | times | div | mod | over;
  139.  
  140. andor = andor;
  141. plusminus = plus | minus;
  142.  
  143. white_space = white_space;
  144. comment1 = comment1;
  145. comment2 = comment2;
  146.  
  147. plus_or_minus = (plus | minus)+ ;
  148.  
  149. Ignored Tokens
  150.  
  151. white_space, comment2, comment1;
  152.  
  153. Productions
  154.  
  155. program {-> program} = {fundef} func_def {->New program(func_def)} ;
  156.  
  157. func_def {-> func_def} = {header} header local_def* block {->New func_def(header, [local_def], block)};
  158.  
  159. sempar {-> sempar} = {sempar} semicolon fpar_def {->New sempar(semicolon, fpar_def.fpar_def)};
  160.  
  161. param {-> param} = {param1} fpar_def? {->New param.param1(fpar_def)} |
  162. {param2} fpar_def sempar* {->New param.param2(fpar_def, [sempar])};
  163.  
  164. header {-> header} = {fun} fun id lparen param rparen colon ret_type {->New header(fun, id, lparen, param, rparen, colon, ret_type)};
  165.  
  166. comid {-> comid} = {comi} com id {->New comid(com, id)};
  167.  
  168. fpar_def {-> fpar_def} = {ref} ref? id comid* colon fpar_type {->New fpar_def(ref, id, [comid], colon, fpar_type)};
  169.  
  170. data_type {-> data_type} = {int} int {->New data_type.int(int)} |
  171. {char} char {->New data_type.char(char)} ;
  172.  
  173. intcon {-> intcon} = {intcon} lsbr int_const rsbr {->New intcon(lsbr, int_const, rsbr)};
  174.  
  175. type {-> type} = data_type intcon* {->New type(data_type, [intcon])};
  176.  
  177. ret_type {-> ret_type} = {data_type} data_type {->New ret_type.data_type(data_type)} |
  178. {nothing} nothing {->New ret_type.nothing(nothing)};
  179.  
  180. sqbrac {-> sqbrac} = {brac} lsbr rsbr {->New sqbrac(lsbr, rsbr)};
  181.  
  182. fpar_type {-> fpar_type} = data_type sqbrac? intcon* {->New fpar_type(data_type, sqbrac, [intcon])};
  183.  
  184. local_def {-> local_def} = {func_def} func_def {->New local_def.func_def(func_def)} |
  185. {func_decl} func_decl {->New local_def.func_decl(func_decl)} |
  186. {var_def} var_def {->New local_def.var_def(var_def)};
  187.  
  188. var_def {-> var_def} = {var} var id comid* colon type semicolon {->New var_def(var, id, [comid], colon, type, semicolon)};
  189.  
  190. func_decl {-> func_decl} = header semicolon {->New func_decl(header, semicolon)};
  191.  
  192. //elstmt {-> stmt*} = {elstmt} else stmt {->New stmt.elstmt([stmt.stmt])};
  193.  
  194. stmt_list {-> stmt} = {stmt_list} stmt* {->New stmt.stmt_list([stmt])};
  195.  
  196. stmt {-> stmt} = {statement} statement {->New stmt.statement(statement.stmt)};
  197.  
  198. statement {-> stmt} = {semi} semicolon {->New stmt.semi()} |
  199. {l_value} l_value ass expr semicolon {->New stmt.l_value(l_value, expr)} |
  200. {block} block {->New stmt.block(block)} |
  201. {func} func_call semicolon {->New stmt.func(func_call)} |
  202. {if} if_stmt {->New stmt.if(if_stmt.stmt)} |
  203. {block1} lparen stmt_list rparen {->New stmt.block1(stmt_list.stmt)} |
  204. {while} while cond do stmt {->New stmt.while(cond, stmt)} |
  205. {return} return expr? semicolon {->New stmt.return(expr)};
  206.  
  207. if_stmt {-> stmt} = {no_else} if cond then [then_stmt]:stmt {->New stmt.no_else(cond, then_stmt.stmt)} |
  208. {witha_else} if cond then [then_stmt]:stmt_with_else else [else_stmt]:stmt {->New stmt.witha_else(cond, then_stmt.stmt, else_stmt.stmt)};
  209.  
  210. stmt_with_else {-> stmt} = {noop} semicolon {->New stmt.semi()} |
  211. {assignment} l_value ass expr semicolon {->New stmt.assignment(l_value, expr)} |
  212. {f_call} func_call semicolon {->New stmt.f_call(func_call)} |
  213. {return1} return expr? semicolon {->New stmt.return1(expr)} |
  214. {ifasas} if_else_stmt {->New stmt.ifasas(if_else_stmt.stmt)} |
  215. {block2} lparen stmt_list rparen {->New stmt.block2(stmt_list.stmt)} |
  216. {block3} block {->New stmt.block3(block)};
  217.  
  218. if_else_stmt {-> stmt} = {if_else_stmt} if cond then [then_stmt]:stmt_with_else else [else_stmt]:stmt_with_else
  219. {->New stmt.if_else_stmt(cond, then_stmt.stmt, else_stmt.stmt)};
  220.  
  221. block {-> block} = {block} lbr stmt* rbr {->New block.block([stmt])};
  222.  
  223. comexpr {-> comexpr} = {comexp} com expr {->New comexpr(com, expr)};
  224.  
  225. expcom {-> expcom} = {expcom} expr comexpr* {->New expcom(expr, [comexpr])};
  226.  
  227. func_call {-> func_call} = id lparen expcom? rparen {->New func_call(id, lparen, expcom, rparen)};
  228.  
  229. l_value {-> l_value} = {id} id {->New l_value.id(id)} |
  230. {string_literal} string_literal {->New l_value.string_literal(string_literal)} |
  231. {l_value1} l_value lsbr expr rsbr {->New l_value.l_value1(l_value, lsbr, expr, rsbr)};
  232.  
  233. expr5 {-> expr} = {expr5a} int_const {->New expr.expr5a(int_const)} |
  234. {expr5b} char_const {->New expr.expr5b(char_const)} |
  235. {expr5c} l_value {->New expr.expr5c(l_value)} |
  236. {expr5d} func_call {->New expr.expr5d(func_call)};
  237.  
  238. expr2 {-> expr} = {expr2a} plus_or_minus expr5 {->New expr.expr2a(expr5.expr)} |
  239. {expr2_minus} minus expr5 {->New expr.expr2_minus(expr5.expr)} |
  240. {expr2_plus} plus expr5 {->New expr.expr2_plus(expr5.expr)} |
  241. {expr2c} times expr5 {->New expr.expr2c(expr5.expr)} |
  242. {expr2d} over expr5 {-> New expr.expr2d(expr5.expr)} |
  243. {expr2e} mod expr5 {->New expr.expr2e(expr5.expr)} |
  244. {expr2f} div expr5 {->New expr.expr2f(expr5.expr)};
  245.  
  246. expr3 {-> expr} = {expr3a} plus_or_minus lparen expr rparen {->New expr.expr3a(expr)} |
  247. {expr3_minus} minus lparen expr rparen {->New expr.expr3_minus(expr)} |
  248. {expr3_plus} plus lparen expr rparen {->New expr.expr3_plus(expr)} |
  249. {expr3c} times lparen expr rparen {->New expr.expr3c(expr)} |
  250. {expr3d} over lparen expr rparen {->New expr.expr3d(expr)} |
  251. {expr4e} mod lparen expr rparen {->New expr.expr4e(expr)} |
  252. {expr5f} div lparen expr rparen {->New expr.expr5f(expr)};
  253.  
  254. expr4 {-> expr} = {expr4a} lparen expr rparen expr3* {->New expr.expr4a(expr, [expr3.expr])} |
  255. {expr4b} lparen expr rparen expr2* {->New expr.expr4b(expr, [expr2.expr])};
  256.  
  257. expr1 {-> expr} = {expr1a} expr5 expr2* {->New expr.expr1a(expr5.expr, [expr2.expr])} |
  258. {expr1b} expr4 {->New expr.expr1b(expr4.expr)} |
  259. {expr1c} expr5 expr3* {->New expr.expr1c(expr5.expr, [expr3.expr])} |
  260. {expr1d} plus_or_minus expr5 expr2* {->New expr.expr1d(expr5.expr, [expr2.expr])} |
  261. {expr1e} plus expr5 expr2* {->New expr.expr1e(expr5.expr, [expr2.expr])} |
  262. {expr1f} minus expr5 expr2* {->New expr.expr1f(expr5.expr, [expr2.expr])};
  263.  
  264. expr {-> expr} = {calc} expr1 {->New expr.calc(expr1.expr)};
  265.  
  266. simple_cond {-> cond} = {comp1} [left]:expr equal [right]:expr {->New cond.comp1(left.expr, right.expr)} |
  267. {comp2} [left]:expr hashtag [right]:expr {->New cond.comp2(left.expr, right.expr)} |
  268. {comp3} [left]:expr sm [right]:expr {->New cond.comp3(left.expr, right.expr)} |
  269. {comp4} [left]:expr big [right]:expr {->New cond.comp4(left.expr, right.expr)} |
  270. {comp5} [left]:expr sme [right]:expr {->New cond.comp5(left.expr, right.expr)} |
  271. {comp6} [left]:expr bige [right]:expr {->New cond.comp6(left.expr, right.expr)};
  272.  
  273. mul_cond {-> cond} = {mul_cond1} [left]:simple_cond and [right]:simple_cond {->New cond.mul_cond1(left.cond, right.cond)} |
  274. {mul_cond2} [left]:simple_cond or [right]:simple_cond {->New cond.mul_cond2(left.cond, right.cond)};
  275.  
  276. not_c {-> cond} = {notc} not condit {->New cond.notc(condit.cond)};
  277.  
  278. cond {-> cond} = {cond} condit {->New cond.cond(condit.cond)};
  279.  
  280. con {-> cond} = {simple} simple_cond {->New cond.simple(simple_cond.cond)} |
  281. {mul} mul_cond {->New cond.mul(mul_cond.cond)};
  282.  
  283. condit {-> cond} = {condit1} lparen condit rparen {->New cond.condit1(condit.cond)} |
  284. {not} not_c {->New cond.not(not_c.cond)} |
  285. {mul_cond} mul_cond {->New cond.mul_cond(mul_cond.cond)} |
  286. {cond1} [left]:expr equal [right]:expr {->New cond.cond1(left.expr, right.expr)} |
  287. {cond2} [left]:expr hashtag [right]:expr {->New cond.cond2(left.expr, right.expr)}|
  288. {cond3} [left]:expr sm [right]:expr {->New cond.cond3(left.expr, right.expr)}|
  289. {cond4} [left]:expr big [right]:expr {->New cond.cond4(left.expr, right.expr)}|
  290. {cond5} [left]:expr sme [right]:expr {->New cond.cond5(left.expr, right.expr)}|
  291. {cond6} [left]:expr bige [right]:expr {->New cond.cond6(left.expr, right.expr)}|
  292. {m_cond_and} [left]:con and [right]:con {->New cond.m_cond_and(left.cond, right.cond)}|
  293. {m_cond_or} [left]:con or [right]:con {->New cond.m_cond_or(left.cond, right.cond)};
  294.  
  295.  
  296. Abstract Syntax Tree
  297. program = func_def;
  298.  
  299. func_def = header local_def* block;
  300.  
  301. sempar = semicolon fpar_def ;
  302.  
  303. param ={param1} fpar_def? |
  304. {param2} fpar_def sempar* ;
  305.  
  306. header = fun id lparen param rparen colon ret_type ;
  307.  
  308. comid = com id ;
  309.  
  310. fpar_def = ref? id comid* colon fpar_type;
  311.  
  312. data_type = {int} int |
  313. {char} char ;
  314.  
  315. intcon = lsbr int_const rsbr;
  316.  
  317. type = data_type intcon*;
  318.  
  319. ret_type = {data_type} data_type |
  320. {nothing} nothing;
  321.  
  322. sqbrac = lsbr rsbr ;
  323.  
  324. fpar_type = data_type sqbrac? intcon* ;
  325.  
  326. local_def = {func_def} func_def |
  327. {func_decl} func_decl |
  328. {var_def} var_def ;
  329.  
  330. var_def = var id comid* colon type semicolon ;
  331.  
  332. func_decl = header semicolon ;
  333. /*
  334. elstmt = else stmt ;
  335.  
  336. stmt_list = stmt* ;
  337. */
  338. stmt = {statement} stmt |
  339. {stmt_list} stmt* |
  340. {semi} |
  341. {l_value} l_value expr |
  342. {block} block |
  343. {func} func_call |
  344. {if} stmt |
  345. {block1} stmt |
  346. {while} cond stmt |
  347. {return} expr? |
  348. {no_else} cond [then_stmt]:stmt |
  349. {witha_else} cond [then_stmt]:stmt [else_stmt]:stmt |
  350. {noop} |
  351. {assignment} l_value expr |
  352. {f_call} func_call |
  353. {return1} expr? |
  354. {ifasas} stmt |
  355. {block2} stmt |
  356. {block3} block |
  357. {if_else_stmt} cond [then_stmt]:stmt [else_stmt]:stmt;
  358.  
  359. // if_el = {witha_else} | {if_else_stmt};
  360. /*
  361. statement = {semicolon} semicolon |
  362. {l_value} l_value ass expr semicolon |
  363. {block} block |
  364. {func} func_call semicolon |
  365. {if} if_stmt |
  366. {block1} lparen stmt_list rparen |
  367. {while} while cond do stmt |
  368. {return} return expr? semicolon;
  369.  
  370. if_stmt = {no_else} if cond then [then_stmt]:stmt |
  371. {witha_else} if cond then [then_stmt]:stmt_with_else else [else_stmt]:stmt;
  372.  
  373. stmt_with_else = {noop} semicolon |
  374. {assignment} l_value ass expr semicolon |
  375. {f_call} func_call semicolon |
  376. {return} return expr? semicolon |
  377. {ifasas} if_else_stmt |
  378. {block} lparen stmt_list rparen |
  379. {block1} block;
  380.  
  381. if_else_stmt = if cond then [then_stmt]:stmt_with_else else [else_stmt]:stmt_with_else;
  382. */
  383. block = {block} stmt* ;
  384.  
  385. comexpr = com expr;
  386.  
  387. expcom = expr comexpr*;
  388.  
  389. func_call = id lparen expcom? rparen;
  390.  
  391. l_value = {id} id |
  392. {string_literal} string_literal |
  393. {l_value1} l_value lsbr expr rsbr;
  394.  
  395. // expr5 = {expr5a} int_const |
  396. // {expr5b} char_const |
  397. // {expr5c} l_value |
  398. // {expr5d} func_call;
  399.  
  400. // expr2 = {expr2a} plus_or_minus expr5 |
  401. // {expr2c} times expr5 |
  402. // {expr2d} over expr5 |
  403. // {expr2e} mod expr5 |
  404. // {expr2f} div expr5;
  405.  
  406. // expr3 = {expr3a} plus_or_minus lparen expr rparen |
  407. // {expr3c} times lparen expr rparen |
  408. // {expr3d} over lparen expr rparen |
  409. // {expr4e} mod lparen expr rparen |
  410. // {expr5f} div lparen expr rparen;
  411.  
  412. // expr4 = {expr4a} lparen expr rparen expr3* |
  413. // {expr4b} lparen expr rparen expr2*;
  414.  
  415. // expr1 = {expr1a} expr5 expr2* |
  416. // {expr1b} expr4 |
  417. // {expr1c} expr5 expr3* |
  418. // {expr1d} plus_or_minus expr5 expr2*;
  419.  
  420. expr = {expr5a} int_const |
  421. {expr5b} char_const |
  422. {expr5c} l_value |
  423. {expr5d} func_call |
  424. {expr2a} expr |
  425. {expr2_minus} expr|
  426. {expr2_plus} expr |
  427. {expr2c} expr |
  428. {expr2d} expr |
  429. {expr2e} expr |
  430. {expr2f} expr |
  431. {expr3a} expr |
  432. {expr3_minus} expr |
  433. {expr3_plus} expr |
  434. {expr3c} expr |
  435. {expr3d} expr |
  436. {expr4e} expr |
  437. {expr5f} expr |
  438. {expr4a} [left]:expr [right]:expr* |
  439. {expr4b} [left]:expr [right]:expr* |
  440. {expr1a} [left]:expr [right]:expr* |
  441. {expr1b} expr |
  442. {expr1c} [left]:expr [right]:expr* |
  443. {expr1d} [left]:expr [right]:expr* |
  444. {expr1e} [left]:expr [right]:expr* |
  445. {expr1f} [left]:expr [right]:expr* |
  446. {calc} expr;
  447. /*
  448. simple_cond = {comp1} [left]:expr equal [right]:expr |
  449. {comp2} [left]:expr hashtag [right]:expr |
  450. {comp3} [left]:expr sm [right]:expr |
  451. {comp4} [left]:expr big [right]:expr |
  452. {comp5} [left]:expr sme [right]:expr |
  453. {comp6} [left]:expr bige [right]:expr;
  454.  
  455. mul_cond = {mul_cond1} [left]:simple_cond and [right]:simple_cond |
  456. {mul_cond2} [left]:simple_cond or [right]:simple_cond;
  457.  
  458. not_c = not condit;
  459. */
  460. cond = {cond} cond |
  461. {comp1} [left]:expr [right]:expr |
  462. {comp2} [left]:expr [right]:expr |
  463. {comp3} [left]:expr [right]:expr |
  464. {comp4} [left]:expr [right]:expr |
  465. {comp5} [left]:expr [right]:expr |
  466. {comp6} [left]:expr [right]:expr |
  467. {mul_cond1} [left]:cond [right]:cond |
  468. {mul_cond2} [left]:cond [right]:cond |
  469. {notc} cond |
  470. {simple} cond |
  471. {mul} cond |
  472. {condit1} cond |
  473. {not} cond |
  474. {mul_cond} cond |
  475. {cond1} [left]:expr [right]:expr |
  476. {cond2} [left]:expr [right]:expr |
  477. {cond3} [left]:expr [right]:expr |
  478. {cond4} [left]:expr [right]:expr |
  479. {cond5} [left]:expr [right]:expr |
  480. {cond6} [left]:expr [right]:expr |
  481. {m_cond_and} [left]:cond [right]:cond |
  482. {m_cond_or} [left]:cond [right]:cond;
  483. /*
  484. con = {simple} simple_cond |
  485. {mul} mul_cond;
  486.  
  487. condit = {condit1} lparen condit rparen |
  488. {not} not_c |
  489. {mul_cond} mul_cond |
  490. {cond1} [left]:expr equal [right]:expr |
  491. {cond2} [left]:expr hashtag [right]:expr |
  492. {cond3} [left]:expr sm [right]:expr |
  493. {cond4} [left]:expr big [right]:expr |
  494. {cond5} [left]:expr sme [right]:expr |
  495. {cond6} [left]:expr bige [right]:expr |
  496. {m_cond_and} [left]:con and [right]:con |
  497. {m_cond_or} [left]:con or [right]:con;
  498. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement