Advertisement
Mikescher

Oberon [3]

Dec 3rd, 2013
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.73 KB | None | 0 0
  1. SCANNER oberon_scan
  2.  
  3. PARSER oberon_pars
  4.  
  5. GLOBAL {
  6. # include <stdio.h>
  7. # include <math.h>
  8. }
  9.  
  10. PREC LEFT '=' '#' '<' '<=' '>' '>=' 'IN' 'IS'
  11. LEFT '+' '-' 'OR'
  12. LEFT '*' '/' 'DIV' 'MOD' '&'
  13. NONE '~' UNARY
  14.  
  15. RULE
  16. root = module .
  17.  
  18. identdef = <
  19. = tok_identifier '*'
  20. .
  21. = tok_identifier
  22. .
  23. > . /* identdef */
  24.  
  25. qualident = <
  26. = tok_identifier '.' tok_identifier
  27. .
  28. = tok_identifier
  29. .
  30. > . /* qualident */
  31.  
  32. number = <
  33. = int_const
  34. .
  35. = real_const
  36. .
  37. > . /* number */
  38.  
  39. /**********************************************************************/
  40. /**********************************************************************/
  41. /**********************************************************************/
  42.  
  43. expression = <
  44. = expression '=' expression
  45. .
  46. = expression '#' expression
  47. .
  48. = expression '<' expression
  49. .
  50. = expression '<=' expression
  51. .
  52. = expression '>' expression
  53. .
  54. = expression '>=' expression
  55. .
  56. = expression 'IN' expression
  57. .
  58. = expression 'IS' expression
  59. .
  60. = expression '+' expression
  61. .
  62. = expression '-' expression
  63. .
  64. = expression 'OR' expression
  65. .
  66. = expression '*' expression
  67. .
  68. = expression '/' expression
  69. .
  70. = expression 'DIV' expression
  71. .
  72. = expression 'MOD' expression
  73. .
  74. = expression '&' expression
  75. .
  76. = '~' expression PREC UNARY
  77. .
  78. = '+' expression PREC UNARY
  79. .
  80. = '-' expression PREC UNARY
  81. .
  82. = '(' expression ')'
  83. .
  84. = set
  85. .
  86. = designator
  87. .
  88. = procedureCall
  89. .
  90. = number
  91. .
  92. = char_const
  93. .
  94. = string_const
  95. .
  96. = 'NIL'
  97. .
  98. > . /* expression */
  99.  
  100. const_expression = expression.
  101.  
  102. expression_ls = <
  103. = expression
  104. .
  105. = expression_ls ',' expression
  106. .
  107. > . /* expression_ls */
  108.  
  109. const_expression_ls = <
  110. = const_expression
  111. .
  112. = const_expression_ls ',' const_expression
  113. .
  114. > . /* expression_ls */
  115.  
  116. const_expression_range = <
  117. = const_expression
  118. .
  119. = const_expression_range '..' const_expression
  120. .
  121. > . /* const_expression_range */
  122.  
  123. designator = <
  124. = tok_identifier
  125. .
  126. = designator '.' tok_identifier
  127. .
  128. = designator '(' expression_ls ')'
  129. .
  130. = designator '(' ')'
  131. .
  132. = designator '[' expression_ls ']'
  133. .
  134. = designator '^'
  135. .
  136. > . /* designator */
  137.  
  138.  
  139. set = '{' element_ls '}' .
  140.  
  141. element_ls = <
  142. = /* epsilon */
  143. .
  144. element_s = <
  145. = element
  146. .
  147. = element_s ',' element
  148. .
  149. > . /* element_s */
  150. >. /* element_ls */
  151.  
  152. element = <
  153. = expression
  154. .
  155. = expression '..' expression
  156. .
  157. > . /* element */
  158.  
  159. /**********************************************************************/
  160. /**********************************************************************/
  161. /**********************************************************************/
  162.  
  163. type = <
  164. = qualident
  165. .
  166. = arrayType
  167. .
  168. = recordType
  169. .
  170. = pointerType
  171. .
  172. = procedureType
  173. .
  174. > . /* type */
  175.  
  176. arrayType = <
  177. = 'ARRAY' const_expression_ls 'OF' type
  178. .
  179. > . /* arrayType */
  180.  
  181. recordType = <
  182. = 'RECORD' fieldListSequence 'END'
  183. .
  184. = 'RECORD' qualident fieldListSequence 'END'
  185. .
  186. > . /* arrayType */
  187.  
  188. pointerType = <
  189. = 'POINTER' 'TO' type
  190. .
  191. > . /* pointerType */
  192.  
  193. procedureType = <
  194. = 'PROCEDURE'
  195. .
  196. = 'PROCEDURE' formalParameters
  197. .
  198. > . /* procedureType */
  199.  
  200. fieldListSequence = <
  201. = fieldList
  202. .
  203. = fieldList ';' fieldListSequence
  204. .
  205. > . /* fieldListSequence */
  206.  
  207. fieldList = <
  208. = /* epsilon */
  209. .
  210. = identList ':' type
  211. .
  212. >. /* fieldList */
  213.  
  214. identList = <
  215. = identdef
  216. .
  217. = identdef ',' identList
  218. .
  219. >. /* identList */
  220.  
  221. formalParameters = <
  222. = '(' fpSection_ls ')'
  223. .
  224. = '(' fpSection_ls ')' ':' qualident
  225. .
  226. > . /* formalParameters */
  227.  
  228. fpSection_ls = <
  229. = /* epsilon */
  230. .
  231. fpSection_s = <
  232. = fpSection
  233. .
  234. = fpSection ';' fpSection_ls
  235. .
  236. > . /* fpSection_s */
  237. > . /* fpSection_ls */
  238.  
  239. fpSection = <
  240. = 'VAR' ident_ls ':' formalType
  241. .
  242. = ident_ls ':' formalType
  243. .
  244. > . /* fpSection */
  245.  
  246. ident_ls = <
  247. = tok_identifier
  248. .
  249. = tok_identifier ',' ident_ls
  250. .
  251. > . /* ident_ls */
  252.  
  253. formalType = <
  254. = 'ARRAY' 'OF' formalType
  255. .
  256. = qualident
  257. .
  258. = procedureType
  259. .
  260. > . /* formalType */
  261.  
  262. /**********************************************************************/
  263. /**********************************************************************/
  264. /**********************************************************************/
  265.  
  266. statement = <
  267. = assignment
  268. .
  269. = procedureCall
  270. .
  271. = ifStatement
  272. .
  273. = caseStatement
  274. .
  275. = whileStatement
  276. .
  277. = repeatStatement
  278. .
  279. = loopStatement
  280. .
  281. = withStatement
  282. .
  283. = exitStatement
  284. .
  285. = returnStatement
  286. .
  287. > . /* statement */
  288.  
  289. assignment = designator ':=' expression .
  290.  
  291. procedureCall = <
  292. = designator
  293. .
  294. > . /* procedureCall */
  295.  
  296. ifStatement = <
  297. = 'IF' expression 'THEN' statementSequence ifStatement_ElseIf_ls 'ELSE' statementSequence 'END'
  298. .
  299. = 'IF' expression 'THEN' statementSequence ifStatement_ElseIf_ls 'END'
  300. .
  301. >. /* ifStatement */
  302.  
  303. ifStatement_ElseIf_ls = <
  304. = /* epsilon */
  305. .
  306. = 'ELSIF' expression 'THEN' statementSequence ifStatement_ElseIf_ls
  307. .
  308. >. /* ifStatement_ElseIf_ls */
  309.  
  310. caseStatement = <
  311. = 'CASE' expression 'OF' caseExp_ls 'ELSE' statementSequence 'END'
  312. .
  313. = 'CASE' expression 'OF' caseExp_ls 'END'
  314. .
  315. > . /* caseStatement */
  316.  
  317. caseExp = <
  318. = /* epsilon */
  319. .
  320. = caseLabelList ':' statementSequence
  321. .
  322. > . /* caseExp */
  323.  
  324. caseExp_ls = <
  325. = caseExp
  326. .
  327. = caseExp '|' caseExp_ls
  328. .
  329. > . /* caseExp_ls */
  330.  
  331. caseLabelList = <
  332. = caseLabels
  333. .
  334. = caseLabels ',' caseLabelList
  335. .
  336. > . /* caseLabelList */
  337.  
  338. caseLabels = const_expression_range.
  339.  
  340. whileStatement = 'WHILE' expression 'DO' statementSequence 'END' .
  341.  
  342. repeatStatement = 'REPEAT' statementSequence 'UNTIL' expression.
  343.  
  344. loopStatement = 'LOOP' statementSequence 'END' .
  345.  
  346. withStatement = 'WITH' qualident ':' qualident 'DO' statementSequence 'END' .
  347.  
  348. exitStatement = 'EXIT' .
  349.  
  350. returnStatement = <
  351. = 'RETURN' expression
  352. .
  353. = 'RETURN'
  354. .
  355. > . /* returnStatement */
  356.  
  357. statementSequence = <
  358. = statement
  359. .
  360. statementSequence_ls = <
  361. = statement ';'
  362. .
  363. = statement ';' statementSequence
  364. .
  365. > . /* statementSequence_ls */
  366. > . /* statementSequence */
  367.  
  368. /**********************************************************************/
  369. /**********************************************************************/
  370. /**********************************************************************/
  371.  
  372. constantDeclaration = identdef '=' const_expression .
  373.  
  374. typeDeclaration = identdef '=' type .
  375.  
  376. varDeclaration = ident_ls ':' type .
  377.  
  378. declarationSequence = <
  379. = declarationSequence_head_ls declarationSequence_foot_ls
  380. .
  381. > . /* declarationSequence */
  382.  
  383. declarationSequence_head_ls = <
  384. = /* epsilon */
  385. .
  386. = 'CONST' ConstDecl_ls declarationSequence_head_ls
  387. .
  388. = 'TYPE' TypeDecl_ls declarationSequence_head_ls
  389. .
  390. = 'VAR' VarDecl_ls declarationSequence_head_ls
  391. .
  392. > . /* declarationSequence_head_ls */
  393.  
  394. declarationSequence_foot_ls = <
  395. = /* epsilon */
  396. .
  397. = procedureDecl ';' declarationSequence_foot_ls
  398. .
  399. = forwardDecl ';' declarationSequence_foot_ls
  400. .
  401. > . /* declarationSequence_foot_ls */
  402.  
  403. ConstDecl_ls = <
  404. = /* epsilon */
  405. .
  406. = constantDeclaration ';' ConstDecl_ls
  407. .
  408. > . /* ConstDecl_ls */
  409.  
  410. TypeDecl_ls = <
  411. = /* epsilon */
  412. .
  413. = typeDeclaration ';' TypeDecl_ls
  414. .
  415. > . /* TypeDecl_ls */
  416.  
  417. VarDecl_ls = <
  418. = /* epsilon */
  419. .
  420. = varDeclaration ';' VarDecl_ls
  421. .
  422. > . /* VarDecl_ls */
  423.  
  424. /**********************************************************************/
  425. /**********************************************************************/
  426. /**********************************************************************/
  427.  
  428. procedureDecl = procedureHead ';' procedureBody tok_identifier .
  429.  
  430. procedureHead = <
  431. ='PROCEDURE' '*' identdef formalParameters
  432. .
  433. ='PROCEDURE' identdef formalParameters
  434. .
  435. ='PROCEDURE' identdef
  436. .
  437. ='PROCEDURE' '*' identdef
  438. .
  439. > . /* procedureHead */
  440.  
  441. procedureBody = <
  442. = declarationSequence 'END'
  443. .
  444. = declarationSequence 'BEGIN' statementSequence 'END'
  445. .
  446. > . /* procedureBody */
  447.  
  448. forwardDecl = <
  449. = 'PROCEDURE' '^' tok_identifier
  450. .
  451. = 'PROCEDURE' '^' tok_identifier '*'
  452. .
  453. = 'PROCEDURE' '^' tok_identifier formalParameters
  454. .
  455. = 'PROCEDURE' '^' tok_identifier '*' formalParameters
  456. .
  457. > . /* forwardDecl */
  458.  
  459. /**********************************************************************/
  460. /**********************************************************************/
  461. /**********************************************************************/
  462.  
  463. import_block = <
  464. = /* epsilon */
  465. .
  466. = 'IMPORT' import_ls ';'
  467. .
  468. > . /* import_ls */
  469.  
  470. import_ls = <
  471. = import
  472. .
  473. = import ',' import_ls
  474. .
  475. > . /* import_ls */
  476.  
  477. import = <
  478. = tok_identifier
  479. .
  480. = tok_identifier ':=' tok_identifier
  481. .
  482. > . /* import */
  483.  
  484. /**********************************************************************/
  485. /**********************************************************************/
  486. /**********************************************************************/
  487.  
  488. module = <
  489. = 'MODULE' tok_identifier ';' import_block declarationSequence 'BEGIN' statementSequence 'END' tok_identifier '.'
  490. .
  491. = 'MODULE' tok_identifier ';' import_block declarationSequence 'END' tok_identifier '.'
  492. .
  493. > . /* module */
  494.  
  495. /**********************************************************************/
  496. /**********************************************************************/
  497. /**********************************************************************/
  498.  
  499.  
  500. /****************************************/
  501.  
  502. /* Tokens */
  503. int_const: [Value: long] {Value := 0; } .
  504. real_const: [Value: double] {Value := 0.0; } .
  505. char_const: [Value: char] {Value := '\0'; } .
  506. string_const: [Value: tStringRef] {Value := ""; } .
  507. tok_identifier: [Value: tStringRef] {Value := ""; } .
  508.  
  509. /* non-terminal attributes */
  510. MODULE attributes
  511. PROPERTY SYN
  512. DECLARE
  513. END attributes
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement