如何编写YACC令牌捕获规则

时间:2013-08-15 18:59:27

标签: token yacc rules

作为学习曲线练习,我使用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的等价物是什么。

2 个答案:

答案 0 :(得分:0)

一旦yyparse()遇到与任何已知语法不匹配的输入,它就会调用yyerror()函数。 请参阅Yacc手册的“错误处理”部分。

答案 1 :(得分:0)

我想你想要错误恢复。 这是我执行错误恢复的一部分:

line:   stmt eol
        { $$ = $1;}
        | T_NEWLINE
        { $$ = NULL;}
        | error T_NEWLINE
        {
                $$ = NULL;
                yyerrok;
        }

当出现语法错误时,第三条规则会使解析器跳到下一行输入并继续解析。 仍然调用yyerror()。不确定它何时被调用,但我的猜测是在调用错误规则之前。 您仍然需要阅读手册的“错误恢复”部分。