Loading ...
Sorry, an error occurred while loading the content.

14070Re: "ocaml_beginners"::[] lexer and parser problem

Expand Messages
  • Philippe Veber
    Jun 28, 2014
    • 0 Attachment

      Hi Arash,

      The rule for "plus" should come before the rule for identifier tokens, otherwise all occurrences of "plus" will be read as identifiers. Regarding your other question, there's a Lexing.from_channel function you might find useful.


      Le 29 juin 2014 00:50, "Arash Alavi alavi.arash@... [ocaml_beginners]" <ocaml_beginners@yahoogroups.com> a écrit :

      I have a question about my program which is divided in two files: lexer.mll and parser.mly.
      The first file is lexer.mll:

      rule lex = parse
        | [' ' '\n' '\t'] { lex lexbuf }
        | ['0'-'9']+ as s { INT(int_of_string s) }
        | ['a'-'z' 'A'-'Z'] ['a'-'z' 'A'-'Z' '0'-'9']* as word { IDENT word }
        | '+'             { ADD } 
        | "plus"          { PLUS } 
        | eof             { EOF  }

      The second file is parser.mly:

      %{ type expr = 
      Int of int
      |String of string
      | Add of expr * expr 


      %token <int> INT
      %token <string> IDENT
      %token ADD 
      %token PLUS 
      %token EOF

      %start expr
      %type <expr> expr

      %left PLUS ADD 


      IDENT             { String $1 }
      |INT              { Int $1 }
      |expr PLUS expr   { Add($1, $3) }
      |expr ADD expr    { Add($1, $3) }

      So as you can see, for example I want to get the same results for both "1+2" and "1plus2" like :
      Add (Int 1, Int 2) 
      But I don't know why it works for "1+2" and it doesn't work for "1plus2".
      I use these commands to run the program:

      (*commands in Windows PowerShell*):
      ocamllex lexer.mll
      ocamlyacc parser.mly

      (*commands and results in OCamlWinPlus*):
      #use "parser.ml";;
      #use "lexer.ml";;
      # expr lex (Lexing.from_string "1+2");;
      - : expr = Add (Int 1, Int 2)
      # expr lex (Lexing.from_string "1plus2");;
      Exception: Parsing.Parse_error.

      Why it works correctly for 1+2 but not for 1plus2? and also how can I use a main class for this program which can get the inputs as a .txt file and return the result in another .txt file so I don't need to use this command (expr lex (Lexing.from_string "1plus2");;) for each code line?


      Arash Alavi
      Department of Computer Engineering & Information Technology
      Amirkabir University of Technology
      Home page: http://ceit.aut.ac.ir/~arash.alavi

    • Show all 3 messages in this topic