如何将合成属性传递给 Ox 中的下一个树节点

问题描述

我正在使用 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 (将#修改为@)