问题描述
我正在使用 Ox 从现有的 bison/yacc 解析器(以及 lex 词法分析器)编写属性语法,并且努力理解 Ox 系统的一个关键概念。
在这个简化的示例中,我的程序是一系列 INTERFACE
。我正在使用符号表 st
来跟踪解析树中的符号。现在我想检查 INTERFACE
的名称是否不在范围内,如果不在,则将其放入范围并将该信息传递给 Program
的其余部分。
然而,Ox
抱怨某些属性没有指定,并且在继承和合成属性方面存在冲突;虽然我明白这意味着什么,但除了删除间接层和获得极其复杂的解析器/属性语法之外,我无法看到如何以不同的方式做到这一点。
你能在这里给我指出正确的方向吗?
我已经寻找了教程,但除了源代码中的示例(但没有使用符号表)之外,没有发现任何使用 ox 的内容,并且 ox 引用在某些方面有点神秘。
这是我的语法:
%{
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int yylex(void);
void yyerror(char *);
extern int line_number;
typedef struct {
string* names;
void** vals;
string* types;
int len;
int maxlen;
} st;
%}
%start Program
%token INTERFACE END CLASS IMPLEMENTS VAR METHOD INT RETURN IF THEN ELSE
%token WHILE DO NOT AND NEW THIS _NULL EOC SCOL COL BRACL BRACR DOT COMMA
%token ASSIGNMENT PLUS ASTERISK MINUS LT EQ DEC HEX ID NEWLINE
@attributes { st st; } Program Interface Class MaybeIDs
%%
Start: Program
@{
@i @Program.st@ = init_st();
@}
Program: INTERFACE Interface SCOL Program
@{
@i @Interface.st@ = @Program.0.st@;
@i @Program.1.st@ = @Interface.st@;
@}
;
Interface: ID COL
END
@{
@i if(contains(@Interface.st@,$1))
oxerror("%s already in scope",$1);
@i add(@Interface.st@,$1,"interface");
@}
;
%%
st init_st(){
struct st newSt;
//...
return st;
}
st cpst(st* st) {
struct st newSt;
// ...
return newSt;
}
void add(st* table,string name,void* val,string type){
// ...
}
boolean containsT(st* table,string type){
//...
return true;
}
boolean contains(st* table,string name){
//...
return true;
}
void remove(st* table,string name) {
//...
}
void oxerror(char* s) {
fprintf(stderr,"Syntax Error line %i: %s\n",line_number,s);
exit(3);
}
void yyerror(char *s) {
fprintf(stderr,"Parse Error on line %i: %s\n",s);
exit(2);
}
int main(void){
yyparse();
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)