我在这里结束了.我无法在ocamllex工作,它让我疯了.这是我的.mll
档案:
{
open Parser
}
rule next = parse
| (['a'-'z'] ['a'-'z']*) as id { Identifier id }
| '=' { EqualsSign }
| ';' { Semicolon }
| '\n' | ' ' { next lexbuf }
| eof { EOF }
Run Code Online (Sandbox Code Playgroud)
以下是我作为输入传入的文件的内容:
a=b;
Run Code Online (Sandbox Code Playgroud)
然而,当我编译并运行该东西时,我在第一个字符上出现错误,说它无效.老实说,我不知道发生了什么,谷歌根本没有帮助我.这怎么可能呢?如你所见,我真的很难过.
编辑:
我工作了很长时间,以至于我放弃了解析器.现在这是我的主文件中的相关代码:
let parse_file filename =
let l = Lexing.from_channel (open_in filename) in
try
Lexer.next l; ()
with
| Failure msg ->
printf "line: %d, col: %d\n" l.lex_curr_p.pos_lnum l.lex_curr_p.pos_cnum
Run Code Online (Sandbox Code Playgroud)
打印出"line:1,col:1".
use*_*017 10
没有相应的ocamlyacc解析器,没有人能够找到你的代码的问题,因为你的词法分析器工作得非常好!
我冒昧地写了下面构造标识符对列表的小解析器(parser.mly),例如输入"a = b;" 应该给出单身人士名单[("a","b")].
%{%}
%token <string> Identifier
%token EqualsSign
%token Semicolon
%token EOF
%start start
%type <(string * string) list> start
%%
start:
| EOF {[]}
| Identifier EqualsSign Identifier Semicolon start {($1, $3) :: $5}
;
%%
Run Code Online (Sandbox Code Playgroud)
为了测试解析器是否符合我的承诺,我们创建了另一个解析字符串"a = b;"的文件(main.ml).并打印结果.
let print_list = List.iter (fun (a, b) -> Printf.printf "%s = %s;\n" a b)
let () = print_list (Parser.start Lexer.next (Lexing.from_string "a=b;"))
Run Code Online (Sandbox Code Playgroud)
代码应编译(例如ocamlbuild main.byte),没有任何投诉,程序应输出"a = b;" 按照承诺.
回应最新的编辑:
一般来说,我不认为捕获旨在表示失败或误用的标准库异常(如Invalid_argument或Failure)是个好主意.原因是它们在整个库中无处不在地使用,因此您通常无法分辨哪个函数引发了异常以及它为什么会这样做.
此外,您丢弃了唯一有用的信息:错误消息!错误消息应该告诉您问题的根源是什么(我最好的猜测是与IO相关的问题).因此,您应该打印错误消息或让异常传播到顶层.就个人而言,我更喜欢后一种选择.
但是,您可能仍希望以优雅的方式处理语法错误的输入.为此,您可以在词法分析器中定义新的异常并添加捕获无效标记的默认大小写.
{
exception Unexpected_token
}
...
| _ {raise Unexpected_token}
Run Code Online (Sandbox Code Playgroud)
现在,您可以在主文件中捕获新定义的异常,并且与以前不同,异常特定于语法无效的输入.因此,您知道异常的来源和原因,使您有机会做出比以前更有意义的事情.
一个相当随机的OCaml开发提示:如果在启用调试信息的情况下编译程序,则将环境变量OCAMLRUNPARAM设置为"b"(例如,导出OCAMLRUNPARAM = b)可以为未捕获的异常启用堆栈跟踪!
顺便说一句.ocamllex也可以+
在正则表达式中为"一个或多个" 执行运算符,所以这个
['a'-'z']+
Run Code Online (Sandbox Code Playgroud)
相当于你的
['a'-'z']['a'-'z']*
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2598 次 |
最近记录: |