groff 的文法是 LALR(1) 吗?
Is groff's grammar LALR(1)?
作为一个宠物项目,我正在尝试使用 Jison(Bison 的 JavaScript 克隆)制作一个 groff 解析器,但我正在努力弄清楚 groff 是否语法是 LALR(1).
有人对此有见解吗?
提前致谢。
更新 1
为了回应 Brian 的担忧,以下是有关我的问题的更多详细信息:
Groff是用C++写的,没有使用Bison,语法是我自己推导的
我已经上传了所有的进度here
解析 troff 的大部分工作都是词法的,尽管您可以使用解析器来评估算术表达式。 "grammar" 否则只是识别控制线并将它们拆分为参数的问题(同样,本质上是词汇)。
如果你打算实现修改控制和转义字符的控件(.cc
、.c2
、.ec
和.eo
),那么你会发现预编译正则表达式很尴尬,虽然控制字符的解决方法并不糟糕。
我想我倾向于将 jison 的使用限制在语言的某些部分,例如算术表达式。
当然,jison 对像 eqn
这样的预处理器会派上用场,以防它在您的计划中。
正如@nci 所说,大部分解析工作只是词法;除了表达式(可能还有 macros/diversions),request/escape 语言本身可能是 LL(1); jison/bison 几乎肯定能胜任这项任务,事实上,可能有点矫枉过正。
根据您目前的代码,您似乎是专门为联机帮助页而不是为一般的 troff 输入实现解析器。如果是这样,那将简化您需要处理的事情;联机帮助页通常不使用条件逻辑或宏(尽管 man 宏本身可能)。
作为一个宠物项目,我正在尝试使用 Jison(Bison 的 JavaScript 克隆)制作一个 groff 解析器,但我正在努力弄清楚 groff 是否语法是 LALR(1).
有人对此有见解吗?
提前致谢。
更新 1
为了回应 Brian 的担忧,以下是有关我的问题的更多详细信息:
Groff是用C++写的,没有使用Bison,语法是我自己推导的
我已经上传了所有的进度here
解析 troff 的大部分工作都是词法的,尽管您可以使用解析器来评估算术表达式。 "grammar" 否则只是识别控制线并将它们拆分为参数的问题(同样,本质上是词汇)。
如果你打算实现修改控制和转义字符的控件(.cc
、.c2
、.ec
和.eo
),那么你会发现预编译正则表达式很尴尬,虽然控制字符的解决方法并不糟糕。
我想我倾向于将 jison 的使用限制在语言的某些部分,例如算术表达式。
当然,jison 对像 eqn
这样的预处理器会派上用场,以防它在您的计划中。
正如@nci 所说,大部分解析工作只是词法;除了表达式(可能还有 macros/diversions),request/escape 语言本身可能是 LL(1); jison/bison 几乎肯定能胜任这项任务,事实上,可能有点矫枉过正。
根据您目前的代码,您似乎是专门为联机帮助页而不是为一般的 troff 输入实现解析器。如果是这样,那将简化您需要处理的事情;联机帮助页通常不使用条件逻辑或宏(尽管 man 宏本身可能)。