我正在编写一个前端来解析一组txt
文件,每个文件包含一组procedures
,例如一个 txt 文件看起来像:
Sub procedure1
...
End Sub
Sub procedure2
...
End Sub
...
syntax.ml
包含:
type ev = procedure_declaration list
type procedure_declaration =
{ procedure_name : string; procedure_body : procedure_body }
type procedure_body = ...
...
parser.mly
好像:
%start main
%type <Syntax.ev> main
%%
main: procedure_declarations EOF { List.rev $1 }
procedure_declarations:
/* empty */ { [] }
| procedure_declarations procedure_declaration { $2 :: $1 }
procedure_declaration:
SUB name = procedure_name EOS
body = procedure_body
END SUB EOS
{ { procedure_name = name; procedure_body = body } }
...
现在,我想检索procedure_declaration
(出于异常处理目的)的解析。这意味着,我想创建parser_pd.mly
and lexer_pd.mll
,并让parser.mly
call parser_pd.main
。因此,parser_pd.mly
看起来像:
%start main
%type <Syntax.procedure_declaration> main
%%
main: procedure_declaration EOF { $1 };
...
由于之前的大部分内容parser.mly
都应该移到parser_pd.mly
中,parser.mly
现在应该比以前轻得多,看起来像:
%start main
%type <Syntax.ev> main
%%
main: procedure_declarations EOF { List.rev $1 }
procedure_declarations:
/* empty */ { [] }
| procedure_declarations procedure_declaration { $2 :: $1 }
procedure_declaration:
SUB name = procedure_name EOS
??????
END SUB EOS
{ { procedure_name = name;
procedure_body = Parser_pd.main (Lexer_pd.token ??????) } }
问题是我不知道如何编写该??????
部分,lexer.mll
哪个应该很轻(因为它只读取 token和END
,并让内容由 处理)。也许一些功能来自SUB
EOS
lexer_pd.mll
Lexing
需要模块中的一些功能?
希望我的问题很清楚......有人可以帮忙吗?