Я написал parser_sub.mly
и lexer_sub.mll
которые могут разобрать subroutine
. A subroutine
является блоком выписки, заключенным в Sub
и End Sub
.Разбор списка подпрограмм
На самом деле, необработанный файл, с которым я хотел бы иметь дело, содержит список подпрограмм и некоторые бесполезные тексты. Вот пример:
' a example file
Sub f1()
...
End Sub
haha
' hehe
Sub f2()
...
End Sub
Так что мне нужно написать parser.mly
и lexer.mll
, которые могут разобрать этот файл, игнорируя все комментарии (например, haha
, ' hehe
и т.д.) и вызов parser_sub.main
и возвращает список подпрограмм.
Может кто-нибудь сказать мне, как позволить парсер игнорировать все бесполезные предложения (предложения за пределами
Sub
иEnd Sub
)?Вот часть
parser.mly
я пытался написать:%{ open Syntax %} %start main %type <Syntax.ev> main %% main: subroutine_declaration* { $1 }; subroutine_declaration: SUB name = subroutine_name LPAREN RPAREN EOS body = procedure_body? END SUB { { subroutine_name = name; procedure_body_EOS_opt = body; } }
правил и разбора для
procedure_body
сложны и фактически определены вparser_sub.mly
иlexer_sub.mll
, так как я мог позволитьparser.mly
иlexer.mll
не повторите определение, и просто позвонитеparser_sub.main
?