Advertisement
Mikescher

Oberon [2]

Nov 27th, 2013
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.02 KB | None | 0 0
  1. # The executable to produce:
  2. MAIN        = oberon-parser
  3.  
  4. # Source files
  5. SRC_C       = main.c
  6. SRC_H       =
  7. SRC     = oberon.scan oberon.pars
  8.  
  9. # Generated files
  10. GEN_C       = oberon_scan.c oberon_scanSource.c oberon_pars.c
  11. GEN_H       = oberon_scan.h oberon_scanSource.h oberon_pars.h
  12. GEN     = oberon.rex oberon_scan.rpp oberon_pars.lrk
  13.  
  14. ###############################################################################
  15.  
  16. include ../config.mk
  17.  
  18. ###############################################################################
  19.  
  20. # Create your parser
  21. all: $(MAIN)
  22.  
  23. # Run the test suite
  24. test:
  25.     ./$(MAIN) test1; echo
  26.     ./$(MAIN) test2; echo
  27.  
  28. ###############################################################################
  29.  
  30. # Create the Parser
  31. oberon_pars.lrk oberon_scan.rpp: oberon$(SOLUTION).pars
  32.     lpp -cxzj oberon$(SOLUTION).pars
  33.  
  34. LARK_OPTS = -cdi -Dw -5  # -5 ==> create the graphic LR-browser
  35. #LARK_OPTS = -cdi -Dw     #    ==> see ../config.mk
  36.  
  37. oberon_pars.c oberon_pars.h: oberon_pars.lrk
  38.     lark $(LARK_OPTS) oberon_pars.lrk
  39.  
  40. # Create the Scanner
  41. oberon.rex: oberon.scan oberon_scan.rpp
  42.     rpp < oberon.scan oberon_scan.rpp > oberon.rex
  43.  
  44. oberon_scan.c oberon_scan.h oberon_scanSource.c oberon_scanSource.h: oberon.rex
  45.     rex -cdis -y oberon.rex
  46.     rm -f oberon_scanDrv.c
  47.  
  48. ###############################################################################
  49.  
  50. include ../common.mk
  51.  
  52. ###############################################################################
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103. ###############################################################################
  104. # Project:  COCKTAIL training
  105. # Descr:    LR parser for an oberonession language
  106. # Kind:     Makefile
  107. # Author:   Dr. Juergen Vollmer <Juergen.Vollmer@informatik-vollmer.de>
  108. # $Id: Makefile,v 1.5 2007/06/03 16:52:25 vollmer Exp $
  109. ###############################################################################
  110.  
  111. # The executable to produce:
  112. MAIN        = oberon-parser
  113.  
  114. # Source files
  115. SRC_C       = main.c
  116. SRC_H       =
  117. SRC     = oberon.scan oberon.pars
  118.  
  119. # Generated files
  120. GEN_C       = oberon_scan.c oberon_scanSource.c oberon_pars.c
  121. GEN_H       = oberon_scan.h oberon_scanSource.h oberon_pars.h
  122. GEN     = oberon.rex oberon_scan.rpp oberon_pars.lrk
  123.  
  124. ###############################################################################
  125.  
  126. include ../config.mk
  127.  
  128. ###############################################################################
  129.  
  130. # Create your parser
  131. all: $(MAIN)
  132.  
  133. # Run the test suite
  134. test:
  135.     ./$(MAIN) test1; echo
  136.     ./$(MAIN) test2; echo
  137.  
  138. ###############################################################################
  139.  
  140. # Create the Parser
  141. oberon_pars.lrk oberon_scan.rpp: oberon$(SOLUTION).pars
  142.     lpp -cxzj oberon$(SOLUTION).pars
  143.  
  144. LARK_OPTS = -cdi -Dw -5  # -5 ==> create the graphic LR-browser
  145. #LARK_OPTS = -cdi -Dw     #    ==> see ../config.mk
  146.  
  147. oberon_pars.c oberon_pars.h: oberon_pars.lrk
  148.     lark $(LARK_OPTS) oberon_pars.lrk
  149.  
  150. # Create the Scanner
  151. oberon.rex: oberon.scan oberon_scan.rpp
  152.     rpp < oberon.scan oberon_scan.rpp > oberon.rex
  153.  
  154. oberon_scan.c oberon_scan.h oberon_scanSource.c oberon_scanSource.h: oberon.rex
  155.     rex -cdis -y oberon.rex
  156.     rm -f oberon_scanDrv.c
  157.  
  158. ###############################################################################
  159.  
  160. include ../common.mk
  161.  
  162. ###############################################################################
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213. SCANNER oberon_scan
  214.  
  215. PARSER  oberon_pars
  216.  
  217. GLOBAL {
  218.  # include <stdio.h>
  219.  # include <math.h>
  220. }
  221.  
  222. PREC LEFT  '=' '#' '<' '<=' '>' '>=' 'IN' 'IS'
  223.      LEFT  '+' '-' 'OR'
  224.      LEFT  '*' '/' 'DIV' 'MOD' '&'
  225.      NONE  '~' UNARY
  226.      
  227. RULE
  228. root    = procedureCall  .
  229.  
  230. identdef = <
  231.     = tok_identifier '*'
  232.     .
  233.     = tok_identifier
  234.     .
  235. > . /* identdef */
  236.  
  237. qualident = <
  238.     = tok_identifier '.' tok_identifier
  239.     .
  240.     = tok_identifier
  241.     .
  242. > . /* qualident */
  243.  
  244. number = <
  245.     = int_const
  246.     .
  247.     = real_const
  248.     .
  249. > . /* number */
  250.  
  251. /**********************************************************************/
  252. /**********************************************************************/
  253. /**********************************************************************/
  254.  
  255. expression = <
  256.     = expression '=' expression
  257.     .
  258.     = expression '#' expression
  259.     .
  260.     = expression '<' expression
  261.     .
  262.     = expression '<=' expression
  263.     .
  264.     = expression '>' expression
  265.     .
  266.     = expression '>=' expression
  267.     .
  268.     = expression 'IN' expression
  269.     .
  270.     = expression 'IS' expression
  271.     .
  272.     = expression '+' expression
  273.     .
  274.     = expression '-' expression
  275.     .
  276.     = expression 'OR' expression
  277.     .
  278.     = expression '*' expression
  279.     .
  280.     = expression '/' expression
  281.     .
  282.     = expression 'DIV' expression
  283.     .
  284.     = expression 'MOD' expression
  285.     .
  286.     = expression '&' expression
  287.     .
  288.     = '~' expression PREC UNARY
  289.     .
  290.     = '(' expression ')'
  291.     .
  292.     = set
  293.     .
  294.     = procedureCall
  295.     .
  296.     = number
  297.     .
  298.     = char_const
  299.     .
  300.     = string_const
  301.     .
  302.     = 'NIL'
  303.     .
  304. > . /* expression */
  305.  
  306. const_expression = expression.
  307.  
  308. expression_ls = <
  309.     = expression
  310.     .
  311.     = expression_ls ',' expression
  312.     .
  313. > . /* expression_ls */
  314.  
  315. const_expression_ls = <
  316.     = const_expression
  317.     .
  318.     = const_expression_ls ',' const_expression
  319.     .
  320. > . /* expression_ls */
  321.  
  322. const_expression_range = <
  323.     = const_expression
  324.     .
  325.     = const_expression_range '..' const_expression
  326.     .
  327. > . /* const_expression_range */
  328.  
  329. actualParameters = <
  330.     = '(' ')'
  331.     .
  332.     = '(' expression_ls ')'
  333.     .
  334. >. /* actualParameters */
  335.  
  336. designator = <
  337.     = tok_identifier
  338.     .
  339.     = tok_identifier designator_actualParameters_ls
  340.     .
  341.     > . /* designator */
  342.  
  343. designator_actualParameters_ls = <
  344.     = /* epsilon */
  345.     .
  346.     = '[' expression_ls ']' designator_actualParameters_ls
  347.     .
  348.     = '(' qualident ')' designator_actualParameters_ls
  349.     .
  350.     = '^' designator_actualParameters_ls
  351.     .
  352.     = '.' tok_identifier designator_actualParameters_ls
  353.     .
  354. > . /* designator_ls */
  355.  
  356. set = '{' element_ls '}' .
  357.  
  358. element_ls = <
  359.     = /* epsilon */
  360.     .
  361.     element_s = <
  362.         = element
  363.         .
  364.         = element_s ',' element
  365.         .
  366.     > . /* element_s */
  367. >. /* element_ls */
  368.  
  369. /**********************************************************************/
  370. /**********************************************************************/
  371. /**********************************************************************/
  372.  
  373. type = <
  374.     = qualident
  375.     .
  376.     = arrayType
  377.     .
  378.     = recordType
  379.     .
  380.     = pointerType
  381.     .
  382.     = procedureType
  383.     .
  384. > . /* type */
  385.  
  386. arrayType = <
  387.     = 'ARRAY' const_expression_ls 'OF' type
  388.     .
  389. > . /* arrayType */
  390.  
  391. recordType = <
  392.     = 'RECORD' fieldListSequence 'END'
  393.     .
  394.     = 'RECORD' qualident fieldListSequence 'END'
  395.     .
  396. > . /* arrayType */
  397.  
  398. pointerType = <
  399.     = 'POINTER' 'TO' type
  400.     .
  401. > . /* pointerType */
  402.  
  403. procedureType = <
  404.     = 'PROCEDURE'
  405.     .
  406.     = 'PROCEDURE' formalParameters
  407.     .
  408. > . /* procedureType */
  409.  
  410. fieldListSequence = <
  411.     = fieldList
  412.     .
  413.     = fieldList ',' fieldListSequence
  414.     .
  415. > . /* fieldListSequence */
  416.  
  417. fieldList = <
  418.     = /* epsilon */
  419.     .
  420.     = identList ':' identdef
  421.     .
  422. >. /* fieldList */
  423.  
  424. identList = <
  425.     = identdef
  426.     .
  427.     = identdef ',' identList
  428.     .
  429. >. /* identList */
  430.  
  431. formalParameters = <
  432.     = '(' fpSection_ls ')'
  433.     .
  434.     = '(' fpSection_ls ')' ':' qualident
  435.     .
  436. > . /* formalParameters */
  437.  
  438. fpSection_ls = <
  439.     = /* epsilon */
  440.     .
  441.     fpSection_s = <
  442.         = fpSection
  443.         .
  444.         = fpSection ';' fpSection_ls
  445.         .
  446.     > . /* fpSection_s */
  447. > . /* fpSection_ls */
  448.  
  449. fpSection = <
  450.     = 'VAR' ident_ls ':' formalType
  451.     .
  452.     = ident_ls ':' formalType
  453.     .
  454. > . /* fpSection */
  455.  
  456. ident_ls = <
  457.     = tok_identifier
  458.     .
  459.     = tok_identifier ',' ident_ls
  460.     .
  461. > . /* ident_ls */
  462.  
  463. formalType = <
  464.     = 'ARRAY' 'OF' formalType
  465.     .
  466.     = qualident
  467.     .
  468.     = procedureType
  469.     .
  470. > . /* formalType */
  471.  
  472. /**********************************************************************/
  473. /**********************************************************************/
  474. /**********************************************************************/
  475.  
  476. statement = <
  477.     = assignment
  478.     .
  479.     = procedureCall
  480.     .
  481.     = ifStatement
  482.     .
  483.     = caseStatement
  484.     .
  485.     = whileStatement
  486.     .
  487.     = repeatStatement
  488.     .
  489.     = loopStatement
  490.     .
  491.     = withStatement
  492.     .
  493. > . /* statement */
  494.  
  495. assignment = designator ':=' expression .
  496.  
  497. procedureCall = designator actualParameters .
  498.  
  499. ifStatement = <
  500.     = 'IF' expression 'THEN' statementSequence ifStatement_ElseIf_ls 'ELSE' statementSequence 'END'
  501.     .
  502.     = 'IF' expression 'THEN' statementSequence ifStatement_ElseIf_ls 'END'
  503.     .
  504. >. /* ifStatement */
  505.  
  506. ifStatement_ElseIf_ls = <
  507.     = /* epsilon */
  508.     .
  509.     = 'ELSIF' expression 'THEN' statementSequence ifStatement_ElseIf_ls
  510.     .
  511. >. /* ifStatement_ElseIf_ls */
  512.  
  513. caseStatement = <
  514.     = 'CASE' expression 'OF' caseExp_ls 'ELSE' statementSequence 'END'
  515.     .
  516.     = 'CASE' expression 'OF' caseExp_ls 'END'
  517.     .
  518. > . /* caseStatement */
  519.  
  520. caseExp = <
  521.     = /* epsilon */
  522.     .
  523.     = caseLabelList ':' statementSequence
  524.     .
  525. > . /* caseExp */
  526.  
  527. caseExp_ls = <
  528.     = caseExp
  529.     .
  530.     = caseExp '|' caseExp_ls
  531.     .
  532. > . /* caseExp_ls */
  533.  
  534. caseLabelList = <
  535.     = caseLabels
  536.     .
  537.     = caseLabels ',' caseLabelList
  538.     .
  539. > . /* caseLabelList */
  540.  
  541. caseLabels = const_expression_range.
  542.  
  543. whileStatement = 'WHILE' expression 'DO' statementSequence 'END' .
  544.  
  545. repeatStatement = 'REPEAT' statementSequence 'UNTIL' expression.
  546.  
  547. loopStatement = 'LOOP' statementSequence 'END' .
  548.  
  549. withStatement = 'WITH' qualident ':' qualident 'DO' statementSequence 'END' .
  550.  
  551. statementSequence = <
  552.     = statement
  553.     .
  554.     = statement ';' statementSequence
  555.     .
  556. > . /* statementSequence */
  557.  
  558. /**********************************************************************/
  559. /**********************************************************************/
  560. /**********************************************************************/
  561.  
  562. constantDeclaration = identdef '=' const_expression .
  563.  
  564. typeDeclaration = identdef '=' type .
  565.  
  566. varDeclaration = ident_ls ':' type .
  567.  
  568. declarationSequence = <
  569.     = declarationSequence_head_ls declarationSequence_foot_ls
  570.     .
  571. > . /* declarationSequence */
  572.  
  573. declarationSequence_head_ls = <
  574.     = /* epsilon */
  575.     .
  576.     = 'CONST' ConstDecl_ls declarationSequence_head_ls
  577.     .
  578.     = 'TYPE' TypeDecl_ls declarationSequence_head_ls
  579.     .
  580.     = 'VAR' VarDecl_ls declarationSequence_head_ls
  581.     .
  582. > . /* declarationSequence_head_ls */
  583.  
  584. declarationSequence_foot_ls = <
  585.     = /* epsilon */
  586.     .
  587.     = procedureDecl ';' declarationSequence_foot_ls
  588.     .
  589.     = forwardDecl ';' declarationSequence_foot_ls
  590.     .
  591. > . /* declarationSequence_foot_ls */
  592.  
  593. ConstDecl_ls = <
  594.     = /* epsilon */
  595.     .
  596.     = constantDeclaration ';' ConstDecl_ls
  597.     .
  598. > . /* ConstDecl_ls */
  599.  
  600. TypeDecl_ls = <
  601.     = /* epsilon */
  602.     .
  603.     = typeDeclaration ';' TypeDecl_ls
  604.     .
  605. > . /* TypeDecl_ls */
  606.  
  607. VarDecl_ls = <
  608.     = /* epsilon */
  609.     .
  610.     = varDeclaration ';' VarDecl_ls
  611.     .
  612. > . /* VarDecl_ls */
  613.  
  614. /**********************************************************************/
  615. /**********************************************************************/
  616. /**********************************************************************/
  617.  
  618. procedureDecl = procedureHead ';' procedureBody tok_identifier .
  619.  
  620. procedureHead = <
  621.     ='PROCEDURE' '*' identdef formalParam
  622.     .
  623.     ='PROCEDURE' identdef formalParam
  624.     .
  625.     ='PROCEDURE' identdef
  626.     .
  627.     ='PROCEDURE' '*' identdef
  628.     .
  629. > . /* procedureHead */
  630.  
  631. procedureBody = <
  632.     = declarationSequence 'END'
  633.     .
  634.     = declarationSequence 'BEGIN' statementSequence 'END'
  635.     .
  636. > . /* procedureBody */
  637.  
  638. forwardDecl = <
  639.     = 'PROCEDURE' '^' tok_identifier
  640.     .
  641.     = 'PROCEDURE' '^' tok_identifier '*'
  642.     .
  643.     = 'PROCEDURE' '^' tok_identifier formalParameters
  644.     .
  645.     = 'PROCEDURE' '^' tok_identifier '*' formalParameters
  646.     .
  647. > . /* forwardDecl */
  648.  
  649. /**********************************************************************/
  650. /**********************************************************************/
  651. /**********************************************************************/
  652.  
  653. import_block = <
  654.     = /* epsilon */
  655.     .
  656.     = 'IMPORT' import_ls ';'
  657.     .
  658. > . /* import_ls */
  659.  
  660. import_ls = <
  661.     = import
  662.     .
  663.     = import ',' import_ls
  664.     .
  665. > . /* import_ls */
  666.  
  667. import = <
  668.     = tok_identifier
  669.     .
  670.     = tok_identifier ':=' tok_identifier
  671.     .
  672. > . /* import */
  673.  
  674. /**********************************************************************/
  675. /**********************************************************************/
  676. /**********************************************************************/
  677.  
  678. module = <
  679.     = 'MODULE' tok_identifier ';' import_block declarationSequence 'BEGIN' statementSequence 'END' tok_identifier '.'
  680.     .
  681.     = 'MODULE' tok_identifier ';' import_block declarationSequence 'END' tok_identifier '.'
  682.     .
  683. > . /* module */
  684.  
  685. /**********************************************************************/
  686. /**********************************************************************/
  687. /**********************************************************************/
  688.  
  689.  
  690. /****************************************/
  691.  
  692. /* Tokens */
  693. int_const:      [Value: long]     {Value := 0;          } .
  694. real_const:     [Value: double]   {Value := 0.0;        } .
  695. char_const:     [Value: char]     {Value := '\0';       } .
  696. string_const:   [Value: tIdent]   {Value := NoIdent;    } .
  697. tok_identifier: [Value: tIdent]   {Value := NoIdent;    } .
  698.  
  699. /* non-terminal attributes */
  700. MODULE attributes
  701. PROPERTY SYN
  702. DECLARE
  703. END attributes
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement