Я пытаюсь разработать формальную грамматику EBNF для docopt.py
(docopt.fs
), с помощью которой можно сгенерировать разумный синтаксический анализатор для программ командной строки на docopt
, но для которого я намерен использовать для направления кода FParsec
F # реализация. Я искал существующую формальную грамматику без удачи. Альтернатива, если вы можете предоставить такую грамматику, которая была бы великолепна.
Только что начал, и это то, где я нахожусь (Давненько я даже не смотрел на EBNF) ...
usage_txt :: sot
[LINES_OF_TEXT+ blank_line+]
ws* "usage" ws* ":" ws* usage
[blank_line+ options]
blank_line+
eot
usage :: PROG_NAME
|| (PROG_NAME ws+ cmd+)+ eol
prog_name :: application name
cmd :: WORD
|| ("(" cmd ")" | "[" cmd "]") ["..."]
|| "<" value_word ">" ["..."]
|| "--" long_opt [("="|ws+) VALUE]
|| "-" (short_opt+ | short_opt[VALUE])
blank_line :: eol eol
short_opt :: a..z
long_opt :: lowercase_word
value_word :: lowercase_word
eol :: (ws|"\r")* "\n"
wsl :: (ws|"\r")* ["\n" (ws|"\r")*]
sol :: (sot | "\n") ws*
ws :: (" "|"\t")
lowercase_word :: a..z (a..z0..9_)*
sot :: start of text
eot :: end of text