在查看好的C#解析器生成器的帖子之后,我偶然发现了GPLEX和GPPG.我想使用GPLEX为GPPG生成令牌来解析和创建树(类似于lex / yacc关系).但是,我似乎无法找到这两者如何相互作用的例子.对于lex / yacc,lex返回由yacc定义的标记,并且可以在yylval中存储值.如何在GPLEX / GPPG中完成此操作(文档中缺少这些内容)?
附件是我想要转换为GPLEX的lex代码:
%{ #include <stdio.h> #include "y.tab.h" %} %% [Oo][Rr] return OR; [Aa][Nn][Dd] return AND; [Nn][Oo][Tt] return NOT; [A-Za-z][A-Za-z0-9_]* yylval=yytext; return ID; %%
谢谢!
安德鲁
解决方法
我有一个类似的问题 – 由于明显缺乏文档而不知道如何使用GPLEX与GPPG的输出.我认为问题源于GPLEX发行版包含gppg.exe和gplex.exe,但仅包含GPLEX文档.
如果你去GPPG主页并下载该发行版,你将获得GPPG的文档,它描述了输入文件的要求,如何构建你的语法等等.哦,你也将再次获得两个二进制文件 – gppg .exe和gplex.exe.
几乎可以将所有内容都包含在一个包中.它肯定可以消除一些混淆,特别是那些可能不熟悉词法分析(标记化)和解析的人(并且可能不是100%熟悉两者之间的差异).
所以无论如何,对于那些可能第一次这样做的人:
GPLEX http://gplex.codeplex.com – 用于标记化/扫描/词法分析(同样的事情)
GPPG http://gppg.codeplex.com/ – 将标记化器的输出作为输入解析.例如,解析器使用语法并且可以执行简单的标记器无法完成的操作,例如检测括号组是否匹配.