提前道歉,我相信对于习惯于使用解析器和语法的人来说,这个问题几乎看起来很蠢,但对我来说这些都是陌生的主题,这是我尝试慢慢进入需要它们的实际情况。
我想为以下“语言”编写一个解析器,其中包含一个看起来像这样的单个“特殊结构”:
\command[ options ]{ contents }
内容可以是任何东西,包括嵌套命令,并且可能包含转义的括号或反斜杠\{ \} \\
。我意识到“任何东西”并不具体,但理想情况下,它们应该通过匹配括号(不包括转义的括号)来确定,如果可能的话。
选项应该是逗号分隔的赋值表达式列表,例如name = value
,但值可能是包含=
或,
字符的带引号字符串。最后,前一个name
和command
应该验证正则表达式\w[\w\d\._-+*]*
——即,第一个字符应该是字母,剩余的字符应该是字母、数字或. _ - + *
中的一个。
使用正则表达式编写这个问题似乎过于复杂(例如,因为值可能包含带引号的字符, =
,否则会分离赋值或名称/值对)。因此,我认为这里最合适的工具是语法,但尽管表面读起来很简单,但我不确定如何编写它(BNF、PEG等?),使用哪种类型的解析器(LR、递归下降等?),以及如何在实际程序中使用解析输出。
我希望得到用Python解释的答案,但如果必要或更适合,当然可以使用其他工具的组合。
注意:这不是关于LaTeX的问题。我意识到它们相似,但是LaTeX比之前的语言复杂得多,例如字符代码取决于上下文。我只是在寻求一个实际的例子,它(我认为)足够简单,适合SO,但在我的日常工作中已经非常有用。