Re: lexer and parser problem

"Philippe Veber [email protected] [ocaml_beginners]" <[email protected]>
Newsgroups gmane.comp.lang.ocaml.beginners
Message-ID <CAOOOohSA3vaAph=7hr_nP3uLcSSnywVY_fi0tM2i0YuZRmpAfw@mail.gmail.com>
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.

Cheers,
  philippe.
Le 29 juin 2014 00:50, "Arash Alavi [email protected]
[ocaml_beginners]" <[email protected]> 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
>
> %%
>
> expr:
> 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?
>
> Regards
>
>
>
> --
> Arash Alavi
> Department of Computer Engineering & Information Technology
> Amirkabir University of Technology
> Email(s): [email protected] , [email protected]
> Home page: http://ceit.aut.ac.ir/~arash.alavi
>
>
>
>
>
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.