Advertisement
Pinto085

Parse

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