wmc.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338
  1. #!/usr/bin/python
  2. import os
  3. import os.path
  4. import sys
  5. import lark
  6. GRAMMAR = r"""
  7. start: toplevel+
  8. ?toplevel: include
  9. | funcdef
  10. | arrdec ";"
  11. | vardec ";"
  12. | varinit ";"
  13. | arrinit ";"
  14. | asm ";"
  15. include: "#" "include" FILENAME
  16. FILENAME: "<" /.+/ ">"
  17. funcdef: NAME "(" params ")" block
  18. varinit: NAME
  19. arrinit: NAME "[" INTEGER "]"
  20. vardec: NAME "=" expr
  21. arrdec: NAME "[" expr "]" ("=" expr)?
  22. params:
  23. | NAME ("," NAME)*
  24. block: "{" op* "}"
  25. asm: "asm" "(" STRING+ ")"
  26. ?op: block
  27. | label
  28. | goto ";"
  29. | break ";"
  30. | continue ";"
  31. | vardec ";"
  32. | arrdec ";"
  33. | varinit ";"
  34. | arrinit ";"
  35. | inc ";"
  36. | dec ";"
  37. | rinc ";"
  38. | rdec ";"
  39. | asm ";"
  40. | funcall ";"
  41. | if
  42. | while
  43. | for
  44. | return ";"
  45. label: NAME ":"
  46. goto: "goto" NAME
  47. break: "break"
  48. continue: "continue"
  49. if: "if" "(" expr ")" op ("else" op)?
  50. while: "while" "(" expr ")" op
  51. for: "for" "(" vardec ";" expr ";" (inc|dec|rinc|rdec|vardec|funcall) ")" op
  52. return: "return" expr
  53. inc: NAME ("[" expr "]")? "++"
  54. dec: NAME ("[" expr "]")? "--"
  55. rinc: "++" NAME ("[" expr "]")?
  56. rdec: "--" NAME ("[" expr "]")?
  57. funcall: NAME "(" args ")"
  58. args:
  59. | [expr ("," expr)*]
  60. ?expr: op1
  61. | op1 "?" op1 ":" expr -> ifexpr
  62. ?op1: op2
  63. | vardec
  64. | arrdec
  65. | op1 "==" op1 -> equals
  66. | op1 "!=" op1 -> not_equals
  67. | op1 "+" op2 -> plus
  68. | op1 "-" op2 -> minus
  69. ?op2: op3
  70. | op2 "*" op2 -> times
  71. | op2 "/" op3 -> divide
  72. | op2 "%" op3 -> modulo
  73. | op2 "<" op3 -> less
  74. | op2 ">" op3 -> greater
  75. | op2 "<=" op3 -> less_or_equals
  76. | op2 ">=" op3 -> greater_or_equals
  77. ?op3: op4
  78. | op3 "**" op4 -> raise
  79. ?op4: op5
  80. | op4 "||" op4 -> or
  81. | op4 "&&" op4 -> and
  82. | "!" atom -> not
  83. | "*" atom -> deref
  84. ?op5: atom
  85. | op5 "[" op1 "]" -> index
  86. ?atom: "(" op1 ")"
  87. | NAME
  88. | INTEGER
  89. | FLOAT
  90. | CHAR
  91. | STRING
  92. | "-" atom -> negate
  93. | array
  94. | funcall
  95. | inc
  96. | dec
  97. | rinc
  98. | rdec
  99. array: "{" atom ("," atom)* "}"
  100. NAME: /[A-Za-z_][a-zA-Z0-9_]*/
  101. INTEGER: /[0-9]+/
  102. FLOAT: /[0-9]+\.[0-9]+/
  103. CHAR: /'(.|(\\.))'/
  104. _STRING_INNER: /(.|\n)*?/
  105. _STRING_ESC_INNER: _STRING_INNER /(?<!\\)(\\\\)*?/
  106. STRING: "\"" _STRING_ESC_INNER "\""
  107. IG: /[ \t\r\n]+/
  108. COM: /\/\*(.|\!)*\*\//
  109. %ignore IG
  110. %ignore COM
  111. """
  112. def parse_escape(s):
  113. return bytes(s, "utf-8").decode("unicode_escape")
  114. class Buffer:
  115. def __init__(self, *init):
  116. self.buffer = list(init)
  117. def emit(self, asm, *args):
  118. if type(asm) is list:
  119. self.buffer.extend(asm)
  120. elif type(asm) is Buffer:
  121. self.buffer.extend(asm.buffer)
  122. else:
  123. self.buffer.append(asm.format(*args))
  124. def generate(self):
  125. return "\n".join(self.buffer)
  126. def __add__(self, other):
  127. if type(other) is Buffer:
  128. return Buffer(
  129. *self.buffer + other.buffer
  130. )
  131. raise TypeError
  132. class Scope:
  133. def __init__(self):
  134. self.scopes = []
  135. self.ndx = 0
  136. self.names = set()
  137. def new(self):
  138. self.scopes.append((self.ndx, {}, {}))
  139. self.ndx += 1
  140. def leave(self):
  141. self.scopes.pop()
  142. def add_label(self, name):
  143. renamed = f"__{self.scopes[-1][0]}l_{name}"
  144. self.scopes[-1][2][name] = renamed
  145. return renamed
  146. def get_label(self, name):
  147. if name not in self.scopes[-1][2]:
  148. raise Exception(f"Undeclared label: '{name}`.")
  149. return self.scopes[-1][2][name]
  150. def is_local(self, name):
  151. return name in self.scopes[-1][1]
  152. def insert(self, name):
  153. renamed = f"__{self.scopes[-1][0]}_{name}"
  154. self.scopes[-1][1][name] = renamed
  155. self.names.add(renamed)
  156. return renamed
  157. def find(self, name):
  158. for _, scope, _ in self.scopes[::-1]:
  159. if name in scope:
  160. return scope[name]
  161. raise Exception(f"Undeclared identifier: '{name}`.")
  162. def __contains__(self, name):
  163. for _, scope, _ in self.scopes[::-1]:
  164. if name in scope:
  165. return True
  166. return False
  167. def __getitem__(self, name):
  168. if name in self:
  169. return self.find(name)
  170. return self.insert(name)
  171. def __iter__(self):
  172. for _, scope, _ in self.scopes[::-1]:
  173. for name in scope:
  174. yield (name, scope[name])
  175. @property
  176. def is_toplevel(self):
  177. return self.scopes[-1][0] == 0
  178. class Func:
  179. def __init__(self, argc, params):
  180. self.argc = argc
  181. self.params = params
  182. class WMC:
  183. def __init__(self):
  184. self.funcs = {}
  185. self.used_symbols = {}
  186. self.where = "toplevel"
  187. self.scope = Scope()
  188. self.scope.new()
  189. self.compiled_funcs = {}
  190. self.arrays_buffer = Buffer()
  191. self.init_buffer = Buffer()
  192. self.buffer = Buffer(
  193. "jw __main",
  194. "pop Y",
  195. "mov 80 _dirBuf",
  196. "mov Y _dirBuf+1",
  197. "dir _dirBuf",
  198. "hlt",
  199. "_dirBuf:0*4",
  200. )
  201. self.label_ndx = 0
  202. self.included_files = set()
  203. self.parser = lark.Lark(GRAMMAR)
  204. self.loops = []
  205. def record_usage(self, name):
  206. if name in self.used_symbols:
  207. self.used_symbols[name].add(self.where)
  208. else:
  209. self.used_symbols[name] = set([self.where])
  210. def is_used(self, name):
  211. if name in ("main", "toplevel"):
  212. return True
  213. if name not in self.used_symbols:
  214. return False
  215. for other in self.used_symbols[name]:
  216. if other == name:
  217. continue
  218. if self.is_used(other):
  219. return True
  220. return False
  221. def make_label(self):
  222. name = f"__{self.label_ndx}l"
  223. self.label_ndx += 1
  224. return name
  225. def make_array(self, value):
  226. name = self.make_label()
  227. self.arrays_buffer.emit(
  228. "{}:{}",
  229. name, value
  230. )
  231. return name
  232. def compile_literal(self, node):
  233. if type(node) is lark.Token:
  234. if node.type == "NAME":
  235. value = self.scope.find(node.value)
  236. self.record_usage(value)
  237. return value
  238. elif node.type in ("INTEGER", "FLOAT"):
  239. return node.value
  240. elif node.type == "CHAR":
  241. return str(ord(parse_escape(node.value[1:-1])))
  242. elif node.type == "STRING":
  243. value = parse_escape(node.value[1:-1])
  244. value = map(ord, value)
  245. value = map(str, value)
  246. value = " ".join(value)
  247. value += " 0"
  248. return value
  249. elif node.data == "array":
  250. value = []
  251. for child in node.children:
  252. value.append(
  253. self.compile_literal(child)
  254. )
  255. return " ".join(value)
  256. raise Exception(f"Not implemented: {node}")
  257. def compile_unary_expr(self, node, *ops):
  258. buffer = Buffer()
  259. buffer.emit(
  260. self.compile_expr(
  261. node.children[0]
  262. )
  263. )
  264. for op in ops:
  265. buffer.emit(op)
  266. return buffer
  267. def compile_binary_expr(self, node):
  268. buffer = Buffer()
  269. buffer.emit(
  270. self.compile_expr(
  271. node.children[0]
  272. )
  273. )
  274. buffer.emit('push Y')
  275. buffer.emit(
  276. self.compile_expr(
  277. node.children[1]
  278. )
  279. )
  280. buffer.emit('push Y')
  281. buffer.emit('pop X')
  282. buffer.emit('pop Y')
  283. return buffer
  284. def compile_compare_expr(self, node, *ops, true='1', false='0'):
  285. buffer = Buffer()
  286. ret_label = self.make_label()
  287. exit_label = self.make_label()
  288. buffer.emit(
  289. self.compile_binary_expr(
  290. node
  291. )
  292. )
  293. for op in ops:
  294. buffer.emit(
  295. op,
  296. ret_label
  297. )
  298. buffer.emit(
  299. "mov {} Y",
  300. false
  301. )
  302. buffer.emit(
  303. "jmp {}",
  304. exit_label
  305. )
  306. buffer.emit(
  307. "{}:",
  308. ret_label
  309. )
  310. buffer.emit(
  311. "mov {} Y",
  312. true
  313. )
  314. buffer.emit(
  315. "{}:",
  316. exit_label
  317. )
  318. return buffer
  319. def compile_expr(self, node):
  320. buffer = Buffer()
  321. if type(node) is lark.Token:
  322. if node.type == "NAME":
  323. buffer.emit(
  324. "mov {} Y",
  325. self.compile_literal(node)
  326. )
  327. elif node.type in ("INTEGER", "FLOAT"):
  328. buffer.emit(
  329. "mov {} Y",
  330. self.compile_literal(node)
  331. )
  332. elif node.type == "CHAR":
  333. buffer.emit(
  334. "mov {} Y",
  335. self.compile_literal(node)
  336. )
  337. elif node.type == "STRING":
  338. buffer.emit(
  339. "ld {} Y",
  340. self.make_array(
  341. self.compile_literal(node)
  342. )
  343. )
  344. else:
  345. raise Exception(f"Not implemented: {node}")
  346. elif node.data == "ifexpr":
  347. else_label = self.make_label()
  348. exit_label = self.make_label()
  349. buffer.emit(
  350. self.compile_expr(
  351. node.children[0]
  352. )
  353. )
  354. buffer.emit(
  355. "nbnz Y {}",
  356. else_label
  357. )
  358. buffer.emit(
  359. self.compile_expr(
  360. node.children[1]
  361. )
  362. )
  363. buffer.emit(
  364. "jmp {}",
  365. exit_label
  366. )
  367. buffer.emit(
  368. "{}:",
  369. else_label
  370. )
  371. buffer.emit(
  372. self.compile_expr(
  373. node.children[2]
  374. )
  375. )
  376. buffer.emit(
  377. "{}:",
  378. exit_label
  379. )
  380. elif node.data == "equals":
  381. buffer.emit(
  382. self.compile_compare_expr(
  383. node,
  384. "sblez X Y !",
  385. "nbnz Y {}",
  386. true='1',
  387. false='0'
  388. )
  389. )
  390. elif node.data == "not_equals":
  391. buffer.emit(
  392. self.compile_compare_expr(
  393. node,
  394. "sblez X Y !",
  395. "nbnz Y {}",
  396. true='0',
  397. false='1'
  398. )
  399. )
  400. elif node.data == "plus":
  401. buffer.emit(
  402. self.compile_binary_expr(
  403. node
  404. )
  405. )
  406. buffer.emit(
  407. "ablez X Y !"
  408. )
  409. elif node.data == "minus":
  410. buffer.emit(
  411. self.compile_binary_expr(
  412. node
  413. )
  414. )
  415. buffer.emit(
  416. "sblez X Y !"
  417. )
  418. elif node.data == "times":
  419. buffer.emit(
  420. self.compile_binary_expr(
  421. node
  422. )
  423. )
  424. buffer.emit(
  425. "mbnz X Y !"
  426. )
  427. elif node.data == "divide":
  428. buffer.emit(
  429. self.compile_binary_expr(
  430. node
  431. )
  432. )
  433. buffer.emit(
  434. "vblz X Y !"
  435. )
  436. elif node.data == "modulo":
  437. buffer.emit(
  438. self.compile_binary_expr(
  439. node
  440. )
  441. )
  442. buffer.emit(
  443. "modbz X Y !"
  444. )
  445. elif node.data == "raise":
  446. buffer.emit(
  447. self.compile_binary_expr(
  448. node
  449. )
  450. )
  451. buffer.emit(
  452. "mov 12 _dirBuf"
  453. )
  454. buffer.emit(
  455. "mov X _dirBuf+1"
  456. )
  457. buffer.emit(
  458. "mov Y _dirBuf+2"
  459. )
  460. buffer.emit(
  461. "dir _dirBuf"
  462. )
  463. buffer.emit(
  464. "mov _dirBuf+2 Y"
  465. )
  466. elif node.data == "or":
  467. true_label = self.make_label()
  468. exit_label = self.make_label()
  469. buffer.emit(
  470. self.compile_expr(
  471. node.children[0]
  472. )
  473. )
  474. buffer.emit(
  475. "nbnz Y !"
  476. )
  477. buffer.emit(
  478. "nbnz Y {}",
  479. true_label
  480. )
  481. buffer.emit(
  482. self.compile_expr(
  483. node.children[1]
  484. )
  485. )
  486. buffer.emit(
  487. "jmp {}",
  488. exit_label
  489. )
  490. buffer.emit(
  491. "{}:",
  492. true_label
  493. )
  494. buffer.emit(
  495. "mov 1 Y"
  496. )
  497. buffer.emit(
  498. "{}:",
  499. exit_label
  500. )
  501. elif node.data == "and":
  502. false_label = self.make_label()
  503. exit_label = self.make_label()
  504. buffer.emit(
  505. self.compile_expr(
  506. node.children[0]
  507. )
  508. )
  509. buffer.emit(
  510. "nbnz Y {}",
  511. false_label
  512. )
  513. buffer.emit(
  514. self.compile_expr(
  515. node.children[1]
  516. )
  517. )
  518. buffer.emit(
  519. "jmp {}",
  520. exit_label
  521. )
  522. buffer.emit(
  523. "{}:",
  524. false_label
  525. )
  526. buffer.emit(
  527. "mov 0 Y"
  528. )
  529. buffer.emit(
  530. "{}:",
  531. exit_label
  532. )
  533. elif node.data == "less":
  534. buffer.emit(
  535. self.compile_compare_expr(
  536. node,
  537. "inc Y",
  538. "sblez X Y {}"
  539. )
  540. )
  541. elif node.data == "greater":
  542. buffer.emit(
  543. self.compile_compare_expr(
  544. node,
  545. "dec Y",
  546. "sblez X Y {}",
  547. true='0',
  548. false='1'
  549. )
  550. )
  551. elif node.data == "less_or_equals":
  552. buffer.emit(
  553. self.compile_compare_expr(
  554. node,
  555. "sblez X Y {}"
  556. )
  557. )
  558. elif node.data == "greater_or_equals":
  559. buffer.emit(
  560. self.compile_compare_expr(
  561. node,
  562. "inc Y",
  563. "sblez X Y {}",
  564. true='0',
  565. false='1'
  566. )
  567. )
  568. elif node.data == "not":
  569. buffer.emit(
  570. self.compile_unary_expr(
  571. node,
  572. "nbnz Y !"
  573. )
  574. )
  575. elif node.data == "deref":
  576. buffer.emit(
  577. self.compile_unary_expr(
  578. node,
  579. "la Y Y"
  580. )
  581. )
  582. elif node.data == "index":
  583. buffer.emit(
  584. self.compile_binary_expr(
  585. node
  586. )
  587. )
  588. buffer.emit(
  589. "ablez X Y !"
  590. )
  591. buffer.emit(
  592. "la Y Y"
  593. )
  594. elif node.data == "negate":
  595. buffer.emit(
  596. self.compile_unary_expr(
  597. node,
  598. "mov Y X",
  599. "sblez X Y !",
  600. "sblez X Y !",
  601. )
  602. )
  603. elif node.data == "array":
  604. buffer.emit(
  605. "ld {} Y",
  606. self.make_array(
  607. self.compile_literal(node)
  608. )
  609. )
  610. elif node.data == "inc":
  611. if len(node.children) == 2:
  612. raise Exception(f"Not implemented: {node}")
  613. name = self.scope[node.children[0].value]
  614. self.record_usage(name)
  615. buffer.emit(
  616. "mov {} Y",
  617. name
  618. )
  619. buffer.emit(
  620. "inc {}",
  621. name
  622. )
  623. elif node.data == "dec":
  624. if len(node.children) == 2:
  625. raise Exception(f"Not implemented: {node}")
  626. name = self.scope[node.children[0].value]
  627. self.record_usage(name)
  628. buffer.emit(
  629. "mov {} Y"
  630. )
  631. buffer.emit(
  632. "dec {}",
  633. name
  634. )
  635. elif node.data == "rinc":
  636. if len(node.children) == 2:
  637. raise Exception(f"Not implemented: {node}")
  638. name = self.scope[node.children[0].value]
  639. self.record_usage(name)
  640. buffer.emit(
  641. "inc {}",
  642. name
  643. )
  644. buffer.emit(
  645. "mov {} Y",
  646. name
  647. )
  648. elif node.data == "rdec":
  649. if len(node.children) == 2:
  650. raise Exception(f"Not implemented: {node}")
  651. name = self.scope[node.children[0].value]
  652. self.record_usage(name)
  653. buffer.emit(
  654. "dec {}",
  655. name
  656. )
  657. buffer.emit(
  658. "mov {} Y"
  659. )
  660. elif node.data == "funcall":
  661. buffer.emit(
  662. self.compile_funcall(node, dest='Y')
  663. )
  664. elif node.data == "vardec":
  665. buffer.emit(
  666. self.compile_op(node)
  667. )
  668. elif node.data == "arrdec":
  669. buffer.emit(
  670. self.compile_arrdec(node)
  671. )
  672. else:
  673. raise Exception(f"Not implemented: {node}")
  674. return buffer
  675. def compile_funcall(self, node, dest='Y'):
  676. buffer = Buffer()
  677. name = node.children[0].value
  678. if name not in self.funcs:
  679. raise Exception(f"Call to an undeclared function: '{name}`.")
  680. if self.funcs[name].argc != len(node.children[1].children):
  681. raise Exception(f"Function '{name}` expects {self.funcs[name].argc} arguments, but got {node.children[1].children}.")
  682. for arg in node.children[1].children[::-1]:
  683. buffer.emit(
  684. self.compile_expr(arg)
  685. )
  686. buffer.emit(
  687. "push Y"
  688. )
  689. buffer.emit(
  690. "jw __{}",
  691. name
  692. )
  693. buffer.emit(
  694. "pop {}",
  695. dest
  696. )
  697. self.record_usage(name)
  698. return buffer
  699. def compile_asm(self, node):
  700. buffer = Buffer()
  701. table = {}
  702. for name, renamed in self.scope:
  703. table[name] = renamed
  704. for child in node.children:
  705. value = parse_escape(child.value[1:-1])
  706. for name in table:
  707. if f"{{{name}}}" in value:
  708. self.record_usage(table[name])
  709. try:
  710. value = value.format(
  711. **table
  712. )
  713. except:
  714. raise Exception("Malformed asm directive.")
  715. buffer.emit(value)
  716. return buffer
  717. def compile_arrdec(self, node):
  718. buffer = Buffer()
  719. name = node.children[0].value
  720. if name in self.scope and len(node.children) == 3: # Index assignment.
  721. name = self.scope.find(name)
  722. self.record_usage(name)
  723. buffer.emit(
  724. self.compile_expr(
  725. node.children[1]
  726. )
  727. )
  728. buffer.emit(
  729. "mov {} X",
  730. name
  731. )
  732. buffer.emit(
  733. "ablez X Y !"
  734. )
  735. buffer.emit(
  736. "push Y"
  737. )
  738. buffer.emit(
  739. self.compile_expr(
  740. node.children[2]
  741. )
  742. )
  743. buffer.emit(
  744. "pop X"
  745. )
  746. buffer.emit(
  747. "str Y X"
  748. )
  749. return buffer
  750. if not self.scope.is_toplevel and self.scope.is_local(name):
  751. raise Exception(f"Duplicated declaration of a local variable: '{node.children[0].value}`.")
  752. name = self.scope[name]
  753. self.record_usage(name)
  754. count = int(node.children[1].value)
  755. if count <= 0:
  756. raise Exception(f"Illegal array declaration '{node.children[0].value}`: array size should be >0, but it is {count}.")
  757. if len(node.children) == 3:
  758. value = self.compile_literal(node.children[2])
  759. size = len(value.split(" ")) # Dirty.
  760. if size < count:
  761. value += f" 0*{count-size}"
  762. elif size != count:
  763. raise Exception(f"Illegal array declaration '{node.children[0].value}`: value size is {size}, but expected {count}.")
  764. buffer.emit(
  765. "ld {} Y",
  766. self.make_array(value)
  767. )
  768. else:
  769. buffer.emit(
  770. "ld {} Y",
  771. self.make_array(f"0*{count}")
  772. )
  773. buffer.emit(
  774. "mov Y {}",
  775. name
  776. )
  777. return buffer
  778. def compile_op(self, node):
  779. buffer = Buffer()
  780. if node.data == "block":
  781. buffer.emit(
  782. self.compile_block(
  783. node
  784. )
  785. )
  786. elif node.data == "label":
  787. buffer.emit(
  788. "{}:",
  789. self.scope.get_label(node.children[0].value)
  790. )
  791. elif node.data == "goto":
  792. buffer.emit(
  793. "jmp {}",
  794. self.scope.get_label(node.children[0].value)
  795. )
  796. elif node.data == "break":
  797. if len(self.loops) < 1:
  798. raise Exception("'break` outside of a loop.")
  799. buffer.emit(
  800. "jmp {}",
  801. self.loops[-1][1]
  802. )
  803. elif node.data == "continue":
  804. if len(self.loops) < 1:
  805. raise Exception("'continue` outside of a loop.")
  806. buffer.emit(
  807. "jmp {}",
  808. self.loops[-1][0]
  809. )
  810. elif node.data == "varinit":
  811. name = node.children[0].value
  812. if self.scope.is_local(name):
  813. raise Exception(f"Duplicated declaration of a local variable: '{name}`.")
  814. self.scope.insert(name)
  815. elif node.data == "vardec":
  816. name = self.scope[node.children[0].value]
  817. self.record_usage(name)
  818. buffer.emit(
  819. self.compile_expr(node.children[1])
  820. )
  821. buffer.emit(
  822. "mov Y {}",
  823. name
  824. )
  825. elif node.data in ("arrdec", "arrinit"):
  826. buffer.emit(
  827. self.compile_arrdec(node)
  828. )
  829. elif node.data in ("inc", "rinc"):
  830. if len(node.children) == 2:
  831. raise Exception(f"Not implemented: {node}")
  832. name = self.scope[node.children[0].value]
  833. self.record_usage(name)
  834. buffer.emit(
  835. "inc {}",
  836. name
  837. )
  838. elif node.data == ("dec", "rdec"):
  839. if len(node.children) == 2:
  840. raise Exception(f"Not implemented: {node}")
  841. name = self.scope[node.children[0].value]
  842. self.record_usage(name)
  843. buffer.emit(
  844. "dec {}",
  845. name
  846. )
  847. elif node.data == "funcall":
  848. buffer.emit(
  849. self.compile_funcall(node, dest='ZZ')
  850. )
  851. elif node.data == "return":
  852. buffer.emit(
  853. self.compile_expr(
  854. node.children[0]
  855. )
  856. )
  857. buffer.emit("push Y")
  858. buffer.emit("ret")
  859. elif node.data == "asm":
  860. buffer.emit(
  861. self.compile_asm(node)
  862. )
  863. elif node.data == "if":
  864. else_label = self.make_label()
  865. exit_label = self.make_label()
  866. buffer.emit(
  867. self.compile_expr(
  868. node.children[0]
  869. )
  870. )
  871. buffer.emit(
  872. "nbnz Y {}",
  873. else_label
  874. )
  875. buffer.emit(
  876. self.compile_op(
  877. node.children[1]
  878. )
  879. )
  880. buffer.emit(
  881. "jmp {}",
  882. exit_label
  883. )
  884. buffer.emit(
  885. "{}:",
  886. else_label
  887. )
  888. if len(node.children) == 3:
  889. buffer.emit(
  890. self.compile_op(
  891. node.children[2]
  892. )
  893. )
  894. buffer.emit(
  895. "{}:",
  896. exit_label
  897. )
  898. elif node.data == "while":
  899. loop_label = self.make_label()
  900. exit_label = self.make_label()
  901. self.loops.append((loop_label, exit_label))
  902. buffer.emit(
  903. "{}:",
  904. loop_label
  905. )
  906. buffer.emit(
  907. self.compile_expr(
  908. node.children[0]
  909. )
  910. )
  911. buffer.emit(
  912. "nbnz Y {}",
  913. exit_label
  914. )
  915. buffer.emit(
  916. self.compile_op(
  917. node.children[1]
  918. )
  919. )
  920. self.loops.pop()
  921. buffer.emit(
  922. "jmp {}",
  923. loop_label
  924. )
  925. buffer.emit(
  926. "{}:",
  927. exit_label
  928. )
  929. elif node.data == "for":
  930. loop_label = self.make_label()
  931. exit_label = self.make_label()
  932. self.loops.append((loop_label, exit_label))
  933. self.scope.new()
  934. buffer.emit(
  935. self.compile_op(
  936. node.children[0]
  937. )
  938. )
  939. buffer.emit(
  940. "{}:",
  941. loop_label
  942. )
  943. buffer.emit(
  944. self.compile_expr(
  945. node.children[1]
  946. )
  947. )
  948. buffer.emit(
  949. "nbnz Y {}",
  950. exit_label
  951. )
  952. buffer.emit(
  953. self.compile_op(
  954. node.children[3]
  955. )
  956. )
  957. buffer.emit(
  958. self.compile_op(
  959. node.children[2]
  960. )
  961. )
  962. self.scope.leave()
  963. self.loops.pop()
  964. buffer.emit(
  965. "jmp {}",
  966. loop_label
  967. )
  968. buffer.emit(
  969. "{}:",
  970. exit_label
  971. )
  972. else:
  973. raise Exception(f"Not implemented: {node}")
  974. return buffer
  975. def collect_labels(self, node):
  976. for child in node.children:
  977. if child.data == "label":
  978. self.scope.add_label(child.children[0].value)
  979. def compile_block(self, node, *prepend_names, scope=True):
  980. if scope:
  981. self.scope.new()
  982. for name in prepend_names:
  983. self.scope.insert(name)
  984. buffer = Buffer()
  985. self.collect_labels(node)
  986. for child in node.children:
  987. buffer.emit(
  988. self.compile_op(child)
  989. )
  990. if scope:
  991. self.scope.leave()
  992. return buffer
  993. def compile_toplevel(self, node):
  994. buffer = Buffer()
  995. if node.data == "funcdef":
  996. name = node.children[0].value
  997. params = self.funcs[name].params
  998. buffer.emit("__{}:", name)
  999. for param in params:
  1000. buffer.emit(
  1001. "pop __{}_{}",
  1002. self.scope.ndx, param
  1003. )
  1004. self.where = name
  1005. buffer.emit(
  1006. self.compile_block(
  1007. node.children[2],
  1008. *params
  1009. )
  1010. )
  1011. buffer.emit(
  1012. "push Z"
  1013. )
  1014. buffer.emit(
  1015. "ret"
  1016. )
  1017. elif node.data == "vardec":
  1018. name = node.children[0].value
  1019. self.init_buffer.emit(
  1020. self.compile_expr(node.children[1])
  1021. )
  1022. self.init_buffer.emit(
  1023. "mov Y __0_{}",
  1024. name
  1025. )
  1026. self.record_usage(f"__0__{name}")
  1027. elif node.data in ("arrdec", "arrinit"):
  1028. self.init_buffer.emit(
  1029. self.compile_arrdec(node)
  1030. )
  1031. elif node.data == "asm":
  1032. buffer.emit(
  1033. self.compile_asm(node)
  1034. )
  1035. elif node.data == "include":
  1036. filename = node.children[0].value[1:-1]
  1037. if not os.path.isfile(filename):
  1038. filename = os.path.join(os.getenv("WC_I"), filename)
  1039. if not os.path.isfile(filename):
  1040. raise Exception(f"No such file: '{os.path.basename(filename)}`.")
  1041. if filename not in self.included_files:
  1042. with open(filename, "r") as f:
  1043. self.compile_program(f.read())
  1044. self.included_files.add(filename)
  1045. elif node.data == "varinit":
  1046. pass
  1047. else:
  1048. raise Exception(f"Not implemented: {node}")
  1049. return buffer
  1050. def collect_toplevel(self, ast):
  1051. for node in ast.children:
  1052. if node.data == "funcdef":
  1053. name = node.children[0].value
  1054. if name in self.funcs:
  1055. raise Exception(f"Duplicated function declaration: '{name}`.")
  1056. self.funcs[name] = Func(
  1057. len(node.children[1].children),
  1058. tuple(map(lambda t: t.value, node.children[1].children))
  1059. )
  1060. elif node.data in ("varinit", "vardec", "arrinit", "arrdec"):
  1061. name = node.children[0].value
  1062. if name in self.scope:
  1063. raise Exception(f"Duplicated top-level variable declaration: '{name}`.")
  1064. self.scope.insert(name) # Because we're at the top-level rn.
  1065. def compile_program(self, text):
  1066. ast = self.parser.parse(text)
  1067. #print(ast.pretty())
  1068. self.collect_toplevel(ast)
  1069. for node in ast.children:
  1070. buffer = self.compile_toplevel(node)
  1071. if node.data == "funcdef":
  1072. self.compiled_funcs[node.children[0].value] = buffer
  1073. else:
  1074. self.buffer.emit(buffer)
  1075. def compile(self, text):
  1076. self.compile_program(text)
  1077. for name in self.compiled_funcs:
  1078. if self.is_used(name):
  1079. self.buffer.emit(self.compiled_funcs[name])
  1080. for param in self.funcs[name].params:
  1081. self.record_usage(param)
  1082. self.buffer = self.init_buffer + self.buffer + self.arrays_buffer
  1083. for name in self.scope.names:
  1084. if self.is_used(name):
  1085. self.buffer.emit(
  1086. "{}:0", name
  1087. )
  1088. if "main" not in self.funcs:
  1089. raise Exception("Missing 'main` function.")
  1090. return self.buffer.generate() + "\n"
  1091. wmc = WMC()
  1092. try:
  1093. if len(sys.argv) == 3:
  1094. with open(sys.argv[1], "r") as fin:
  1095. with open(sys.argv[2], "w") as fout:
  1096. fout.write(wmc.compile(fin.read()))
  1097. else:
  1098. sys.stdout.write(wmc.compile(sys.stdin.read()))
  1099. except Exception as e:
  1100. #__import__('traceback').print_exc()
  1101. print(e)
  1102. sys.exit(1)