Search code examples
haskellparsec

End of file unexpected in haskell


I think I have researched very hard about my problem so here I am.

I have a "end of file unexpected" error at line 6 colunm 33.

I have already tried many solutions to resolve my problem.

Here is my code and the file I am trying to parse.

Here is the text I am trying to parse :

ifc.txt :

#9512= IFCBUILDINGSTOREY('3y21AUC9X4yAqzLGUny16E',#16,'Story',$,$,#9509,$,$,.ELEMENT.,6200.);
#9509= IFCLOCALPLACEMENT(#115,#9506);
#9506= IFCAXIS2PLACEMENT3D(#9502,#9498,#9494);
#9502= IFCCARTESIANPOINT((0.,0.,6200.));
#9498= IFCDIRECTION((0.,0.,1.));
#9494= IFCDIRECTION((1.,0.,0.));

Here is the code :

code.hs :

import Text.ParserCombinators.Parsec
main = do
  f <- readFile "ifc.txt"
  let m = (parse ifc "" f)
  print m

ifc :: Parser IfcModel
ifc = many ifcentry

ifcentry = do
  string "#"
  i <- idt
  string "= "
  name <- idt
  string "("
  prop <- idt
  string ")"
  string ";"
  string "\n"
  return (i,name,prop)

idt = many (letter <|> digit <|> char ','
   <|> char '$' <|> char ')' <|> char '\''
   <|> char '=' <|> char ';'  <|> char '\n'
   <|> char ' ' <|> char '(' <|> char '#'
   <|> char '.' <|> char '\r')

Thanks for your help, i should have checked a bit earlier my anwser because i worked on my own and i found asolution i will post it when i can (8hours left for a newbie like me who has less than 10 in reputation).

Thanks again.


Solution

  • Thanks for your help everyone, i should have checked a bit earlier my anwser because i worked on my own and finally found a solution :

    import Text.ParserCombinators.Parsec
    
    main = do
     f <- readFile "ifc.txt"
     let m = (parse ifc "" f)
     print m
    
    type IfcIdt = String
    type IfcName = String
    type IfcProp = [String]
    type IfcModel = [(IfcIdt,IfcName,IfcProp)]
    
    ifc :: Parser IfcModel
    ifc = many ifcentry
    
    ifcentry = do
     string "#"
     i <- idtnumber
     string "= "
     name <- idtname
     opening
     prop <- ifcprop
     closing
     eol
     return (i,name,prop)
    
    idtnumber = many digit
    idtname = many (letter <|> digit)
    
    ifcprop = sepBy prop (char ',')
    prop = many (noneOf "=,();\n")
    eol = string ";\n"
    opening = try (string "((")
     <|> string "("
    closing = try (string "))")
     <|> string ")"