2012-12-21 34 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