作为学习曲线练习,我使用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。这个我有一个大概的想法。我问的是,在我开发项目时,我的'词法分析器'正在返回'yaccer'的所有其他TOKEN的全局捕获。在'lexer'中,你通常有一个空函数调用,不对正在读取的文本做任何事情,比如。
“LATER” |
“JUNK” |
{WS}+ |
\n |
. ;
YACC的等价物是什么。
答案 0 :(得分:0)
一旦yyparse()遇到与任何已知语法不匹配的输入,它就会调用yyerror()函数。 请参阅Yacc手册的“错误处理”部分。
答案 1 :(得分:0)
我想你想要错误恢复。 这是我执行错误恢复的一部分:
line: stmt eol
{ $$ = $1;}
| T_NEWLINE
{ $$ = NULL;}
| error T_NEWLINE
{
$$ = NULL;
yyerrok;
}
当出现语法错误时,第三条规则会使解析器跳到下一行输入并继续解析。 仍然调用yyerror()。不确定它何时被调用,但我的猜测是在调用错误规则之前。 您仍然需要阅读手册的“错误恢复”部分。