【问题标题】:Multiple attributes in bison野牛中的多个属性
【发布时间】:2013-03-19 22:59:14
【问题描述】:

我在 bison 中进行语义分析,我想使用与令牌关联的多个属性。我的代码的相关部分是:

%union semrec
{
    int Type;
    char *id;

}

%start prog

%token <id>  tIDENT

在这里,我只能使用带有 tIDENT 令牌的“id”属性。我还想将“类型”属性与 tIDENT 令牌相关联。为此,我尝试了以下方法:

 %token <id>  tIDENT
 %token <Type>  tIDENT

但它给了我一个令牌 tIDENT 的重新声明警告。我还尝试了以下方法:

 %token <id> <Type> tIDENT

它也没有工作。我能做些什么?我认为这只是一个小语法问题。

谢谢。

【问题讨论】:

    标签: compiler-construction semantics bison lexical-analysis


    【解决方案1】:

    您不能这样做:您必须以这样一种方式定义您的%union,使所有具有多个“属性”的符号都有一个struct 来定义所有这些“属性”。类似的东西

    %union
    {
      struct
      {
        int type;
        char *id;
      } type_id;
    }
    %type <type_id> tIDENT
    

    并使用$1.type$1.id 等。

    但是请注意,我非常怀疑您做的事情是否正确。您需要 AST(抽象语法树)的可能性很高。您应该查找相关信息。

    【讨论】:

    • 谢谢,但这次我收到以下错误:在扫描仪中,我有类似的东西:[A-Za-z][A-Za-z0-9]* {yylval.id = (char *) strdup(yytext);return tIDENT;} 现在它说 'YYSTYPE' 没有名为 'id' 的成员
    • 您还必须调整您的扫描仪,例如yylval.type_id.id = strdup(yytext)。您可能应该仔细阅读 Bison 关于语义值的文档。
    • 现在没问题,当我将其更改为 [A-Za-z][A-Za-z0-9]* {yylval.type_id.id = (char *) strdup(yytext) ;返回 tIDENT;}。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多