比lex / yacc更好的解决方案,用于在C中解析DSL?
|
我的程序之一在运行时接受命令(例如
kill foo
)。可以将其视为一种特定于领域的语言。这里有一些例子:
kill
kill client
exit
但是,也允许链接命令,并且命令前后的空格不重要,因此以下示例也有效:
kill ; say \"that was fun\"
kill ; kill ; kill;
我目前使用lex / yacc(具体来说是flex / bison)实现了这一点,这引起了很多麻烦。词法分析器非常依赖于上下文(例如,通常不返回空白标记,除非在例如kill
关键字之后),并且其状态很多。语法曾经有冲突,我真的不喜欢必须指定的格式(尤其是$ 1,$ 2,$ 3,...对于非终结符使用参数)。同样,bison提供的(在解析时)错误消息有时是准确的,但通常不是准确的(带有可选参数的kill
命令会导致诸如Unexpected $undefined, expected $end or ;
代替kill client
的错误消息,例如Unexpected $undefined, expected $end or ;
)。最后,yacc的C API很残酷(外部定义了整个地方)。
我并不是要您解决所有上述问题(如果无法解决lex / yacc,我将用更具体的描述和代码打开单独的线程)。相反,我对lex / yacc的替代品感兴趣。
我的标准如下:
输入是一个字符串(const char *),没有输出,但是应该为每个不同的关键字调用一些代码。
我想将此与C(C99)一起使用。
该软件应该已经包含在主要的Linux发行版中,或者至少易于捆绑/打包。
应该有据可查。
描述我的语言的语法应该很简单。
在解析错误时,它应该输出有意义的错误消息。
性能并不是那么重要(当然应该很快,但是典型的用例是交互式用法,而不是处理大量MB的命令)。
没有找到相关结果
已邀请:
6 个回复
翰冒绢县
弛保矮瘦敖
捐焦
铰齐插
捕暑句簿姓
用
穿过Ragel,它会吐出
。
邪罗逢确胃