2012-12-21 29 views
3

我已经实现了this example,它运行良好。通过Lexing.from_string解析字符串

现在,我想从一个字符串读取,而不是从stdin读书,所以我改变了calc.ml

let _ = 
    try 
    let lexbuf = Lexing.from_string "1+3" in 
    let result = Parser.main Lexer.token lexbuf in 
    print_int result 
    with Lexer.Eof -> 
    print_string "Lexer.Eof"; 
    exit 0 

而且奇怪的是,它返回Lexer.Eof作为结果。如果我从lexer.mll中删除| eof { raise Eof },它会告知Fatal error: exception Failure("lexing: empty token")。我想end-of-input条件有什么不对...有人知道如何更改词法分析器,以便它可以lex一个字符串?

回答

3

你忘了EOL:

let _ = 
    try 
    let lexbuf = Lexing.from_string "1+3\n" in 
    let result = Parser.main Lexer.token lexbuf in 
    print_int result 
    with Lexer.Eof -> 
    print_string "Lexer.Eof"; 
    exit 0 

编辑

或者,如果你不希望添加的EOL:

parser.mly,添加令牌EOF和:

| expr EOF     { $1 } 

lexer.mll,不会提高EOF但返回的令牌EOF

| eof   { EOF } 

最后,calc.ml

let _ = 
    let lexbuf = Lexing.from_string "3+1" in 
    let result = Parser.main Lexer.token lexbuf in 
    print_int result 
+0

谢谢,这确实工作。但是我想解析没有EOL的正常刺痛。我改成'main:expr {$ 1};'在'parser.mly'中,奇怪地用'1 + 3''仍然返回'Lexer.Eof','Lexing.from_string'只接受以' “\ n”'? – SoftTimur

+0

我编辑了我的答案。 – cago