ファイルのセットを解析するフロントエンドをtxt
作成しています。各ファイルには一連の が含まれていprocedures
ます。たとえば、1 つの 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
ここで、 (例外処理の目的で)の解析を取得したいと思います。つまり、 and を作成parser_pd.mly
し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
andのみを読み取り、EOS
によって処理されるコンテンツを許可するためlexer_pd.mll
)。おそらく、Lexing
モジュールのいくつかの機能が必要ですか?
私の質問が明確であることを願っています...誰か助けてくれますか?