我很难想出如何用bison编写解析器。
为了在符号表中插入变量,以便进行类型检查和其他无意义操作,我需要变量名和类型。
我特别关注这些台词:

%union {tokentype token;
        char *type;
        sPtr names; //stack pointer
       }
<%token definitions>
%token <token> ID ICONST
%type <type> stype type
%type <names> IDlist

vardcl          : IDlist ':' type
                ;

IDlist          : IDlist ',' ID
                | ID
                ;

type            : ARRAY '[' integer_constant RANGE integer_constant ']' OF stype { $$ = $8 }
                | stype { $$ = $1 }
                ;

stype           : INT { $$ = "INT" }
                | BOOLEAN { $$ = "BOOLEAN" }
                ;

如果我的语法是这样的:
vardcl          : ID ':' type
                ;

我可以这样做:
vardcl          : ID ':' type { SymbolTableInsert($1, $3); }
                ;

但我的语法是这样的:
vardcl          : IDlist ':' type
                ;

IDlist          : IDlist ',' ID
                | ID
                ;

所以我试图将每个ID放入一个数据结构中(我已经为符号表使用了一个堆栈,所以我想我也可以使用它),但是我不断地得到关于$arguments类型的不兼容错误,我甚至不确定我是否正在推送我需要的任何东西:
IDlist          : IDlist ',' ID { $$ = SCreate(CompareStrings); SPush($$, $3); }
                | ID { $$ = SCreate(CompareStrings); SPush($$, $1);
                ;

我得到错误“SPush的参数2的类型不兼容,应为void*not tokentype”。当我试图把东西插入我的符号表时也会遇到同样的错误。
做这个有什么好方法?
提前谢谢你的帮助。

最佳答案

在语法方面,一切看起来都很好。看起来您的问题实际上是C的问题:检查SPush函数的签名,它似乎是第二个参数是void*的函数,而不是tokentype(这是ID的声明类型)。

09-26 20:33
查看更多