4

我已经实现了这个示例,并且效果很好。

现在,我想从字符串中读取而不是从 读取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作为结果返回。如果我| eof { raise Eof }lexer.mlland 中删除,它会告诉Fatal error: exception Failure("lexing: empty token"). 我想end-of-input条件有问题...有谁知道如何更改词法分析器以便它可以对字符串进行词法分析?

4

1 回答 1

4

您忘记了 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
于 2012-12-21T14:31:36.313 回答