作为学习曲线练习,我使用 lex 和 yacc 将“C”头文件转换为我的 Prolog 编译器可以用来调用 dll 并从 lib 文件中提取 objs 的东西。编译器需要方法名和参数才能传递。例如
WINGDIAPI void APIENTRY glAccum (GLenum op, GLfloat value);
WINGDIAPI void APIENTRY glAlphaFunc (GLenum func, GLclampf ref);
WINGDIAPI GLboolean APIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences);
WINGDIAPI void APIENTRY glArrayElement (GLint i);
应该转化为
glAccum (unsigned op, core::real32 value);
glAlphaFunc (unsigned func, core::real32 ref);
glAreTexturesResident (integer n, pointer textures, pointer residences) -> core::char8;
glArrayElement (integer i);
在头文件的开头使用一些 typedef
typedef unsigned int GLenum;
typedef unsigned char GLboolean;
typedef unsigned int GLbitfield;
typedef signed char GLbyte;
typedef short GLshort;
typedef int GLint;
typedef int GLsizei;
typedef unsigned char GLubyte;
typedef unsigned short GLushort;
typedef unsigned int GLuint;
typedef float GLfloat;
typedef float GLclampf;
typedef double GLdouble;
typedef double GLclampd;
typedef void GLvoid;
有一个额外的表可以将“C”内置类型转换为 Prolog 内置类型。
对于我目前需要的所有标记,我都有一个工作的词法分析器。 我的问题是. 在我项目的 yacc 部分中编写规则时。如何编写一个全局规则来捕获我尚未编写规则的所有 TOKENS,以便我可以逐步处理我的项目。编写和测试每条规则。我要做的第一件事是捕获 typedef 并将它们的关联写到一个小的查找表中,以便稍后在处理函数和参数列表时,我可以插入正确的 PROLOG 原语。请注意。我不是在问如何编写规则来捕获 typedef。这我有一个粗略的想法。我在问如何在我开发我的项目时对我的“lexer”返回到“yaccer”的所有其他 TOKEN 进行全局捕获。在“词法分析器”中,您通常有一个空函数调用,对正在阅读的文本不做任何事情,例如。
“LATER” |
“JUNK” |
{WS}+ |
\n |
. ;
什么是 YACC 等价物。