Advertisement
Pinto085

Parse2

Dec 15th, 2021
529
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. data Token = Program
  2.             | Id String
  3.             | Sc                -- semicolon
  4.             | End
  5.             | If
  6.             | Then
  7.             | Else
  8.             | While
  9.             | Do
  10.             | Read
  11.             | Write
  12.             | Num Int
  13.             | Eq                -- COP Latex-Like...
  14.             | Neq               -- not equal
  15.             | G                 -- greater than
  16.             | Geq               -- greater or equal than
  17.             | L                 -- less than
  18.             | Leq               -- less or equal than
  19.             | Add               -- +
  20.             | Sub               -- -
  21.             | Mul               -- *
  22.             | Div               -- /
  23.             | Lp                -- (
  24.             | Rp                -- )
  25.             | Begin
  26.             | Att               -- :=
  27.             | Assign
  28.             deriving (Eq, Show)
  29.  
  30. data ASTid = ID String
  31.              deriving (Eq, Show)
  32. data ASTint = NUM Int
  33.               deriving (Eq, Show)
  34. data ASTop = ADD | SUB | MUL | DIV              -- + | - | * | /
  35.               deriving (Eq, Show)
  36. data ASTcop = Eqt | Neqt | Gt | Geqt | Lt | Leqt    -- == | != | > | >= | < | <=
  37.               deriving (Eq, Show)
  38. data ASTexpr = E1 ASTid | E2 ASTint | E3 ASTop ASTexpr ASTexpr
  39.                deriving (Eq, Show)
  40. data ASTcomp = COMP1 ASTcop ASTexpr ASTexpr
  41.              | COMP2 ASTexpr
  42.                deriving (Eq, Show)
  43. data ASTstat = SC ASTstat ASTstat
  44.              | ASSIGN ASTid ASTexpr
  45.              | IF ASTcomp ASTstat ASTstat
  46.              | WHILE ASTcomp ASTstat
  47.              | READ ASTid
  48.              | WRITE ASTexpr
  49.                deriving (Eq, Show)
  50. data ASTprog = P ASTid ASTstat
  51.                deriving (Eq, Show)
  52.  
  53.  
  54. idT :: Token -> String
  55. idT t =
  56.     case t of
  57.         Id str -> str
  58.  
  59. numT :: Token -> Int
  60. numT t =
  61.     case t of
  62.         Num num -> num
  63.  
  64. cop :: Token -> Bool
  65. cop t = case t of
  66.             Eq   -> True
  67.             Neq  -> True
  68.             L    -> True
  69.             Leq  -> True
  70.             G    -> True
  71.             Geq  -> True
  72.             otherwise -> False
  73.  
  74. eop :: Token -> Bool
  75. eop t = case t of
  76.             Add  -> True
  77.             Sub  -> True
  78.             otherwise -> False
  79.  
  80. top :: Token -> Bool
  81. top t = case t of
  82.             Mul       -> True
  83.             Div       -> True
  84.             otherwise -> False
  85.  
  86. isId :: Token -> Bool
  87. isId t = case t of
  88.             Id str    -> True
  89.             otherwise -> False
  90.  
  91. isNum :: Token -> Bool
  92. isNum t = case t of
  93.             Num num   -> True
  94.             otherwise -> False
  95.  
  96. isSc :: Token -> Bool
  97. isSc t = case t of
  98.             Sc        -> True
  99.             otherwise -> False
  100.  
  101. cEOP :: Token -> ASTop
  102. cEOP t =    case t of
  103.                 Add  -> ADD
  104.                 Sub  -> SUB
  105.                 Mul  -> MUL
  106.                 Div  -> DIV
  107.  
  108. cCOP :: Token -> ASTcop
  109. cCOP t =    case t of
  110.                 Eq  -> Eqt
  111.                 Neq -> Neqt
  112.                 L   -> Lt
  113.                 Leq -> Leqt
  114.                 G   -> Gt
  115.                 Geq -> Geqt
  116.  
  117.  
  118.  
  119. sequenceEXPR :: [Token] -> (ASTexpr, [Token])
  120. sequenceEXPR s1 =   let
  121.                         (x1, s2) = sequenceTERM s1
  122.                         t:s3 = s2
  123.                     in
  124.                         if eop t then
  125.                             let
  126.                                 (x2, sn) = sequenceTERM s3
  127.                             in
  128.                                 (E3 (cEOP t) x1 x2, sn)
  129.                         else
  130.                             let
  131.                                 sn = s2
  132.                             in
  133.                                 (x1, sn)
  134.  
  135. sequenceTERM :: [Token] -> (ASTexpr, [Token])
  136. sequenceTERM s1 =   let
  137.                         (x1, s2) = sequenceFACT s1
  138.                         t:s3 = s2
  139.                     in
  140.                         if top t then
  141.                             let
  142.                                 (x2, sn) = sequenceFACT s3
  143.                             in
  144.                                 (E3 (cEOP t) x1 x2, sn)
  145.                         else
  146.                             let
  147.                                 sn = s2
  148.                             in
  149.                                 (x1, sn)
  150.  
  151.  
  152. sequenceCOMP :: [Token] -> (ASTcomp, [Token])
  153. sequenceCOMP s1 =   let
  154.                         (x1, s2) = sequenceEXPR s1
  155.                         t:s3 = s2
  156.                     in
  157.                         if cop t then
  158.                             let
  159.                                 (x2, sn) = sequenceEXPR s3
  160.                             in
  161.                                 (COMP1 (cCOP t) x1 x2, sn)
  162.                         else
  163.                             let
  164.                                 sn = s2
  165.                             in
  166.                                 ((COMP2 x1), sn)
  167.  
  168.  
  169. sequenceFACT :: [Token] -> (ASTexpr, [Token])                      
  170. sequenceFACT s1 =   let
  171.                         t:s2 = s1
  172.                     in
  173.                         if isId t then
  174.                             let
  175.                                 sn = s2
  176.                             in
  177.                                 ((E1 (ID (idT t))), sn)
  178.                         else if isNum t then
  179.                             let
  180.                                 sn = s2
  181.                             in
  182.                                 ((E2 (NUM (numT t))), sn)
  183.                         else
  184.                             let
  185.                                 Lp:s2 = s1
  186.                                 (e, s3) = sequenceEXPR s2
  187.                                 Rp:sn = s3
  188.                             in
  189.                                 (e, sn)
  190.  
  191. sequenceSTAT :: [Token] -> (ASTstat, [Token])
  192. sequenceSTAT s1 =   let
  193.                         (x1, s2) = stat s1
  194.                         t:s3 = s2
  195.                     in
  196.                         if isSc t then
  197.                             let
  198.                                 (x2, sn) = sequenceSTAT s3
  199.                             in
  200.                                 ((SC x1 x2), sn)
  201.                         else
  202.                             let
  203.                                 sn = s2
  204.                             in
  205.                                 (x1, sn)
  206.  
  207. idTk :: [Token] -> (ASTid, [Token])
  208. idTk s1 = let
  209.             x:sn = s1
  210.         in
  211.             if isId x then
  212.                 ((ID (idT x)), sn)
  213.             else
  214.                 error "Ill Formed Program"
  215.  
  216. stat :: [Token] -> (ASTstat, [Token])
  217. stat s1 = let
  218.             t:s2 = s1
  219.           in
  220.             case t of
  221.             Begin ->
  222.                 -- Begin
  223.                 let
  224.                     (x1, sn) = sequenceSTAT s2
  225.                 in
  226.                     (x1, [End]++sn)
  227.             If ->
  228.                 -- If
  229.                 let
  230.                     (c, s3) = sequenceCOMP s2
  231.                     Then:s4 = s3
  232.                     (x1, s5) = stat s4
  233.                     Else:s6 = s5
  234.                     (x2, sn) = stat s6
  235.                 in
  236.                     ((IF c x1 x2), sn)
  237.             While ->
  238.                 -- While
  239.                 let
  240.                     (c, s3) = sequenceCOMP s2
  241.                     Do:s4 = s3
  242.                     (x, sn) = stat s4
  243.                 in
  244.                     ((WHILE c x), sn)
  245.             Read ->
  246.                 -- Read
  247.                 let
  248.                     (i, sn) = idTk s2
  249.                 in
  250.                     ((READ i), sn)
  251.             Write ->
  252.                 -- Write
  253.                 let
  254.                     (e, sn) = sequenceEXPR s2
  255.                 in
  256.                     ((WRITE e), sn)
  257.             Id str ->
  258.                 -- Assign
  259.                 let
  260.                     Att:s3 = s2
  261.                     (e, sn) = sequenceEXPR s3
  262.                 in
  263.                     ((ASSIGN (ID str) e), sn)
  264.             otherwise ->
  265.                 error "Ill Formed Program"
  266.  
  267. prog :: [Token] -> (ASTprog, [Token])
  268. prog s1 =   let
  269.                 Program:s2 = s1
  270.                 (y, s3) = idTk s2
  271.                 Sc:s4 = s3
  272.                 (z, s5) = stat s4
  273.                 End:sn = s5
  274.             in
  275.                 ((P y z), sn)
  276.  
  277. a = [Program, Id "foo", Sc, While, Id "a", Add, Num 3, L, Id "b", Do, Id "b", Att, Id "b", Add, Num 1, End]
  278. b = [Program, Id "foo", Sc, Begin, While, Id "a", Add, Num 3, L, Id "b", Do, Id "b", Att, Id "b", Add, Num 1, Sc, While, Id "a", Add, Num 3, L, Id "b", Do, Id "b", Att, Id "b", Add, Num 1, End, End]
  279. c = [Program, Id "foo", Sc, Id "a", Att, Num 5, Add, Num 5, End]
  280. d = [Program, Id "foo", Sc, Read, Id "a", End]
  281. e = [Program, Id "foo", Sc, Write, Num 5, Add, Num 5, End]
  282. f = [Program, Id "foo", Sc, If, Id "a", Then, Id "b", Att, Num 5, Else, Id "b", Att, Num 123, End]
  283.  
  284.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement