作为一个宠物项目,我正在尝试使用Jison(Bison 的 JavaScript 克隆)制作一个 groff 解析器,但我正在努力弄清楚 groff 的语法是否为 LALR(1)。
有没有人对此有所了解?
提前致谢。
更新 1
为了回应布赖恩的担忧,以下是有关我的问题的更多详细信息:
Groff 是用 C++ 编写的,不使用 Bison,我自己推导出语法。
我已经在这里上传了我的所有进度
解析 troff 的大部分工作都是词法的,尽管您可以使用解析器来评估算术表达式。否则,“语法”只是识别控制线并将它们分成参数的问题(同样,本质上是词汇)。
如果您打算实现修改控制字符和转义字符(.cc
、、和)的控件.c2
,那么您会发现预编译的正则表达式很笨拙,尽管控制字符的解决方法并不糟糕。.ec
.eo
我想我倾向于将 jison 的使用限制在算术表达式之类的语言中。
当然,jison 对于像这样的预处理器会派上用场eqn
,以防万一在您的计划中。
As @nci said, most of the parsing work is just lexical; other than the expressions (and possibly macros/diversions) the request/escape language itself is probably LL(1); jison/bison is almost certainly up to the task, and indeed, probably overkill.
Based on your code so far it looks like you're implementing a parser for manpages specifically, rather than for general troff input. If so, that simplifies what you need to handle; manpages generally don't use conditional logic or macros (although the man macros themselves may).