zoukankan      html  css  js  c++  java
  • lex&yacc5--YYSTYPE

    yacc里的YYSTYPE默认是int型的,当然也可以勇%union来定义联合
    但是由于程序需要,我要将YYSTYPE定义为我自己定义的一个struct的指针
    然后作为一个全局变量,让lex在扫描的时候,可以直接把扫描的东西放到
    yylval指向的树节点里去。

    但是我在yacchf.h中#define YYSTYPE TreeNodePoint这样是不行的
    然而试着在.y文件里的也是不行的。那样在.tab.h文件里,它define的还是
    int型的YYSTYPE。在.tab.c文件里则有两个定义。决定很诡异
    在.tab.h文件里是
    #ifndef YYSTYPE 
    #define YYSTYPE int
    #endif
    在.tab.c文件里

    #define YYSTYPE TreeNodePoint
    ...
    #ifndef YYSTYPE
    #define YYSTYPE int
    #endif
    这样,当程序编译运行的时候,YYSTYPE到底是什么型的呢?
    ===============================================================
    // 词法扫描器文件:lex.l
    %{
      #include <string>
    // 将yylval的值类型由默认的int修改为std::string类型,实际上可以修改为你认为的任
    // 何类型,仅仅只是需要定一个这样YYSTYPE宏即可,特别注意,这个宏定义必须在后面
    // 的标记文件yacc.tab.h之前定义,并且在yacc文件中也要有这个YYSTYPE定义,并且必
    // 须和这里的保持一致。实际上YYSTYPE的定义在生成的标记文件yacc.tab.h中有一个宏
    // 判断,如果用户也就是我们定义了YYSTYPE宏,那么就用我们定义的YYSTYPE,否则就用
    // 默认的YYSTYPE,也就是int类型:) 
    #define YYSTYPE std::string
    #include "yacc.tab.h"
    -------------------------
    // 语法分析器文件:yacc.y
    %{
    #include <iostream>
    #define YYSTYPE std::string
    extern int yylex();

    代码来源:http://blog.csdn.net/pandaxcl/article/details/1536784
    ===============================================================

    //#define YYSTYPE char // it does not give error ,but it not change the y.tab
    //#define YYSTYPE std::string // it does not know the 'std'
    //#define YYSTYPE string // it unknow 'string'

  • 相关阅读:
    封装( 增删改 查 )类
    php注释规范
    php访问mysql数据库
    php 文件限速下载代码
    jQuery鼠标事件汇总
    权限管理
    文件管理 打开-返回上级
    文件操作
    简单的文件上传
    ajax XML
  • 原文地址:https://www.cnblogs.com/orchid-sky/p/3645670.html
Copyright © 2011-2022 走看看