Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.62 KB | None | 0 0
  1. class
  2. {
  3. New(fileName)
  4. {
  5. .tokenizing = Tokenizing(fileName)
  6. .space = ""
  7. .result = ""
  8. .int = "^[\d]+$"
  9. .str = "^[\"][\w]"
  10. .idetifier = "^[^\\d\\W]\\w*\\Z"
  11. .symbol = "(.*)(\\{|\\}|\\(|\\)|\\[|\\]|\\.|\\,|;|\\+|-|\\*|/|&|\\||<|>|=|~)(.*)"
  12. }
  13.  
  14. addSpace()
  15. {
  16. .space $= " "
  17. }
  18.  
  19. subSpace()
  20. {
  21. .space = .space.Substr(2)
  22. }
  23.  
  24. WriteClass()
  25. {
  26. .tokenizing.Advance()
  27. .result $= "\n" $ .space $ "<class>"
  28. .addSpace()
  29.  
  30. .writeTag("class","keyword")
  31. .tokenizing.Advance()
  32. .writeTag(.tokenizing.Token(), "identifier")
  33. .tokenizing.Advance()
  34. .writeTag(.tokenizing.Token(), "symbol")// write {
  35.  
  36. .tokenizing.Advance()
  37. while(.tokenizing.Token() is "static" or .tokenizing.Token() is "field"){
  38. .writeClassVarDec()//ToDo
  39. .tokenizing.Advance()
  40. }
  41.  
  42. while(.tokenizing.Token() is "constructor"
  43. or .tokenizing.Token() is "function"
  44. or.tokenizing.Token() is "method"){
  45. .writeSubRoutine()//ToDo
  46. .tokenizing.Advance()
  47. }
  48. .writeTag(.tokenizing.Token(), "symbol")// write }
  49. .subSpace()
  50. .result $= "\n" $ .space $ "</class>"
  51. return .result
  52. }
  53.  
  54. writeClassVarDec()
  55. {
  56. .result $= "\n" $ .space $ "<classVarDec>"
  57. .addSpace()
  58.  
  59. .writeTag(.tokenizing.Token(),"keyword")// var
  60.  
  61. .tokenizing.Advance()
  62. .isType()
  63.  
  64. .tokenizing.Advance()
  65. .writeTag(.tokenizing.Token(),"identifier")
  66.  
  67. .tokenizing.Advance()
  68. while(.tokenizing.Token() is "," )
  69. {
  70. .writeTag(.tokenizing.Token(),"symbol")
  71. .tokenizing.Advance()
  72. .writeTag(.tokenizing.Token(),"identifier")
  73. .tokenizing.Advance()
  74. }
  75.  
  76. .writeTag(.tokenizing.Token(),"symbol") // write ;
  77. .subSpace()
  78. .result $= "\n" $ .space $ "</classVarDec>"
  79. }
  80.  
  81. writeTag(terminal,type)
  82. {
  83. if(terminal[0] is '"')
  84. {
  85. terminal = terminal.Substr(1,-1)
  86. terminal = terminal.Replace("_"," ")
  87. }
  88.  
  89. .result $= "\n" $ .space $ "<" $ type $ "> " $ terminal $ " </" $ type $ ">"
  90. }
  91.  
  92. writeSubRoutine()
  93. {
  94. .result $= "\n" $ .space $ "<subroutineDec>"
  95. .addSpace()
  96. .writeTag(.tokenizing.Token(),"keyword")//ect. method
  97. .tokenizing.Advance()
  98.  
  99. if .tokenizing.Token() is "void"
  100. .writeTag(.tokenizing.Token(),"keyword")//ect. method
  101. else
  102. .isType()
  103.  
  104. .tokenizing.Advance()
  105. .writeTag(.tokenizing.Token(),"identifier")
  106. .tokenizing.Advance()
  107. .writeTag(.tokenizing.Token(),"symbol") // write (
  108. .writeParameterList()
  109. .writeTag(.tokenizing.Token(),"symbol") // write )
  110. .tokenizing.Advance()
  111. .writeSubroutineBody()
  112. .subSpace()
  113. .result $= "\n" $ .space $ "</subroutineDec>"
  114. }
  115.  
  116. writeParameterList()
  117. {
  118. .result $= "\n" $ .space $ "<parameterList>"
  119. .addSpace()
  120. .tokenizing.Advance()
  121. if(.isType())
  122. {
  123. .tokenizing.Advance()
  124. .writeTag(.tokenizing.Token(),"identifier")
  125. .tokenizing.Advance()
  126. while(.tokenizing.Token() is "," )
  127. {
  128. .writeTag(.tokenizing.Token(),"symbol")
  129. .tokenizing.Advance()
  130. .isType()
  131. .tokenizing.Advance()
  132. .writeTag(.tokenizing.Token(),"identifier")
  133. .tokenizing.Advance()
  134. }
  135. }
  136. .subSpace()
  137. .result $= "\n" $ .space $ "</parameterList>"
  138. }
  139.  
  140. writeSubroutineBody()
  141. {
  142. .result $= "\n" $ .space $ "<subroutineBody>"
  143. .addSpace()
  144. .writeTag(.tokenizing.Token(), "symbol")//write {
  145. .tokenizing.Advance()
  146.  
  147. while(.tokenizing.Token() is "var" )
  148. {
  149. .writeVarDec()
  150. .tokenizing.Advance()
  151. }
  152.  
  153. .writeStatements()
  154. .writeTag(.tokenizing.Token(), "symbol")//write }
  155. .subSpace()
  156. .result $= "\n" $ .space $ "</subroutineBody>"
  157. }
  158.  
  159. writeVarDec()
  160. {
  161. .result $= "\n" $ .space $ "<varDec>"
  162. .addSpace()
  163. .writeTag(.tokenizing.Token(),"keyword")//var
  164. .tokenizing.Advance()
  165. .isType()
  166. .tokenizing.Advance()
  167. .writeTag(.tokenizing.Token(),"identifier")
  168. .tokenizing.Advance()
  169. while(.tokenizing.Token() is ",")
  170. {
  171. .writeTag(.tokenizing.Token(), "symbol")//write ,
  172. .tokenizing.Advance()
  173. .writeTag(.tokenizing.Token(),"identifier")
  174. .tokenizing.Advance()
  175. }
  176.  
  177. .writeTag(.tokenizing.Token(), "symbol")//write ;
  178.  
  179. .subSpace()
  180. .result $= "\n" $ .space $ "</varDec>"
  181. }
  182.  
  183. writeStatements()
  184. {
  185. .result $= "\n" $ .space $ "<statements>"
  186. .addSpace()
  187.  
  188. while(.isKeyword(.tokenizing.Token()))
  189. {
  190. switch .tokenizing.Token()
  191. {
  192. case "if":
  193. .writeIf()
  194. .tokenizing.Advance()
  195. case "let":
  196. .writeLet()
  197. .tokenizing.Advance()
  198. case "while":
  199. .writeWhile()
  200. .tokenizing.Advance()
  201. case "do":
  202. .writeDo()
  203. .tokenizing.Advance()
  204. case "return":
  205. .writeReturn()
  206. .tokenizing.Advance()
  207. }
  208. }
  209.  
  210. .subSpace()
  211. .result $= "\n" $ .space $ "</statements>"
  212. }
  213.  
  214. writeLet()
  215. {
  216. .result $= "\n" $ .space $ "<letStatement>"
  217. .addSpace()
  218.  
  219. .writeTag(.tokenizing.Token(),"keyword")//let
  220. .tokenizing.Advance()
  221. .writeTag(.tokenizing.Token(),"identifier")
  222. .tokenizing.Advance()
  223.  
  224. if .tokenizing.Token() is "["
  225. {
  226. .writeTag(.tokenizing.Token(), "symbol")//write [
  227. .tokenizing.Advance()
  228. .writeExpression()//ToDo
  229. .writeTag(.tokenizing.Token(), "symbol")//write ]
  230. .tokenizing.Advance()
  231. }
  232. .writeTag(.tokenizing.Token(), "symbol")//write =
  233. .tokenizing.Advance()
  234. .writeExpression()
  235. .writeTag(.tokenizing.Token(), "symbol")//write ;
  236.  
  237. .subSpace()
  238. .result $= "\n" $ .space $ "</letStatement>"
  239. }
  240.  
  241. writeIf()
  242. {
  243. .result $= "\n" $ .space $ "<ifStatement>"
  244. .addSpace()
  245.  
  246. .writeTag(.tokenizing.Token(),"keyword")//if
  247. .tokenizing.Advance()
  248. .writeTag(.tokenizing.Token(), "symbol")//write (
  249. .tokenizing.Advance()
  250. .writeExpression()
  251. .writeTag(.tokenizing.Token(), "symbol")//write )
  252. .tokenizing.Advance()
  253. .writeTag(.tokenizing.Token(), "symbol")//write {
  254. .tokenizing.Advance()
  255. .writeStatements()
  256. .writeTag(.tokenizing.Token(), "symbol")//write }
  257.  
  258. .tokenizing.Advance()
  259. if(.tokenizing.Token() is "else")
  260. {
  261. .writeTag(.tokenizing.Token(),"keyword")//else
  262. .tokenizing.Advance()
  263. .writeTag(.tokenizing.Token(), "symbol")//write {
  264. .tokenizing.Advance()
  265. .writeStatements()
  266. .writeTag(.tokenizing.Token(), "symbol")//write }
  267. .tokenizing.Advance()
  268. }
  269. .subSpace()
  270. .result $= "\n" $ .space $ "</ifStatement>"
  271. }
  272.  
  273. writeWhile()
  274. {
  275. .result $= "\n" $ .space $ "<whileStatement>"
  276. .addSpace()
  277.  
  278. .writeTag(.tokenizing.Token(),"keyword")//while
  279. .tokenizing.Advance()
  280. .writeTag(.tokenizing.Token(), "symbol")//write (
  281. .tokenizing.Advance()
  282. .writeExpression()
  283. .writeTag(.tokenizing.Token(), "symbol")//write )
  284. .tokenizing.Advance()
  285. .writeTag(.tokenizing.Token(), "symbol")//write {
  286. .tokenizing.Advance()
  287. .writeStatements()
  288. .writeTag(.tokenizing.Token(), "symbol")//write }
  289.  
  290. .subSpace()
  291. .result $= "\n" $ .space $ "</whileStatement>"
  292. }
  293.  
  294. writeDo()
  295. {
  296. .result $= "\n" $ .space $ "<doStatement>"
  297. .addSpace()
  298.  
  299. .writeTag(.tokenizing.Token(),"keyword")//do
  300. .tokenizing.Advance()
  301. .writeTag(.tokenizing.Token(),"identifier")
  302. .tokenizing.Advance()
  303. .writeTag(.tokenizing.Token(), "symbol")//write ( or .
  304. .writeSubRoutineCall()
  305. .tokenizing.Advance()
  306. .writeTag(.tokenizing.Token(), "symbol")//write ;
  307.  
  308.  
  309. .subSpace()
  310. .result $= "\n" $ .space $ "</doStatement>"
  311. }
  312.  
  313. writeReturn()
  314. {
  315. .result $= "\n" $ .space $ "<returnStatement>"
  316. .addSpace()
  317.  
  318. .writeTag(.tokenizing.Token(),"keyword")//return
  319. .tokenizing.Advance()
  320. if(.tokenizing.Token() isnt ";")
  321. .writeExpression()
  322. .writeTag(.tokenizing.Token(), "symbol")//write ;
  323.  
  324. .subSpace()
  325. .result $= "\n" $ .space $ "</returnStatement>"
  326. }
  327.  
  328. writeExpression()
  329. {
  330. .result $= "\n" $ .space $ "<expression>"
  331. .addSpace()
  332.  
  333. .writeTerminal()
  334. while(Object("+","-","*","/","&","|","<",">","=").Find(.tokenizing.Token()) isnt false)
  335. {
  336. .writeTag(.symbol(.tokenizing.Token()), "symbol")
  337. .tokenizing.Advance()
  338. .writeTerminal()
  339. }
  340.  
  341. .subSpace()
  342. .result $= "\n" $ .space $ "</expression>"
  343. }
  344.  
  345. writeTerminal()
  346. {
  347. .result $= "\n" $ .space $ "<term>"
  348. .addSpace()
  349.  
  350. if (.tokenizing.Token() =~ .int ) {
  351. .writeTag(.tokenizing.Token(), "integerConstant")
  352. .tokenizing.Advance()
  353. } else if (.tokenizing.Token() =~ .str) {
  354. .writeTag(.tokenizing.Token(), "stringConstant")
  355. .tokenizing.Advance()
  356. } else if (Object("true","false","null","this").Find(.tokenizing.Token()) isnt false) {
  357. .writeTag(.tokenizing.Token(),"keyword")
  358. .tokenizing.Advance()
  359. } else if (Object("-","~").Find(.tokenizing.Token()) isnt false) {
  360. .writeTag(.tokenizing.Token(),"symbol")
  361. .tokenizing.Advance()
  362. .writeTerminal()
  363. } else if (.tokenizing.Token() =~ .idetifier) {
  364. .writeTag(.tokenizing.Token(), "identifier")
  365. .tokenizing.Advance()
  366. if (.tokenizing.Token() is "[") {
  367. .writeTag(.tokenizing.Token(),"symbol")
  368. .writeArrayTerm()
  369. .tokenizing.Advance()
  370. } else if (Object(".","(").Find(.tokenizing.Token()) isnt false) {
  371. .writeTag(.tokenizing.Token(), "symbol")//write ( or .
  372. .writeSubRoutineCall()
  373. .tokenizing.Advance()
  374. }
  375. } else if (.tokenizing.Token() =~ .symbol) {
  376. if (.tokenizing.Token() is "(") {
  377. .writeTag(.tokenizing.Token(),"symbol")
  378. .tokenizing.Advance()
  379. .writeExpression()
  380. if (.tokenizing.Token() is ")") {
  381. .writeTag(.tokenizing.Token(),"symbol")
  382. .tokenizing.Advance()
  383. }
  384. }
  385. }
  386. .subSpace()
  387. .result $= "\n" $ .space $ "</term>"
  388. }
  389.  
  390. writeArrayTerm()
  391. {
  392. .tokenizing.Advance()
  393. .writeExpression()
  394. .writeTag(.tokenizing.Token(), "symbol")//write ]
  395. }
  396.  
  397. writeSubRoutineCall()
  398. {
  399. if .tokenizing.Token() is "("
  400. {
  401. .tokenizing.Advance()
  402. .writeExpressionList()
  403. .writeTag(.tokenizing.Token(), "symbol")//write )
  404. }
  405. else
  406. {
  407. .tokenizing.Advance()
  408. .writeTag(.tokenizing.Token(), "identifier")
  409. .tokenizing.Advance()
  410. .writeTag(.tokenizing.Token(), "symbol")//write (
  411. .tokenizing.Advance()
  412. .writeExpressionList()
  413. .writeTag(.tokenizing.Token(), "symbol")//write )
  414.  
  415. }
  416. }
  417.  
  418. writeExpressionList()
  419. {
  420. .result $= "\n" $ .space $ "<expressionList>"
  421. .addSpace()
  422.  
  423. if .tokenizing.Token() isnt ")"
  424. {
  425. .writeExpression()
  426. while .tokenizing.Token() is ","
  427. {
  428. .writeTag(.tokenizing.Token(), "symbol")//write (
  429. .tokenizing.Advance()
  430. .writeExpression()
  431. }
  432. }
  433.  
  434. .subSpace()
  435. .result $= "\n" $ .space $ "</expressionList>"
  436. }
  437.  
  438.  
  439. isType()
  440. {
  441. if (.tokenizing.Token() =~ "^(int|char|boolean)$") {
  442. .writeTag(.tokenizing.Token(), "keyword")
  443. return true
  444. } else if (.tokenizing.Token() =~ .idetifier) {
  445. .writeTag(.tokenizing.Token(), "identifier")
  446. return true
  447. } else {
  448. return false
  449. }
  450. }
  451.  
  452. isKeyword(str)
  453. {
  454. keywords = #["let","if","do","while","return"]
  455. for key in keywords
  456. if str is key
  457. return true
  458. return false
  459. }
  460.  
  461. symbol(sym)
  462. {
  463. switch sym
  464. {
  465. case "<":
  466. sym = "&lt;"
  467. case ">":
  468. sym = "&gt;"
  469. case "&":
  470. sym = "&amp";
  471. default:
  472. }
  473. return sym
  474. }
  475.  
  476.  
  477. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement