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'

  • 相关阅读:
    找到搜索的北了
    zoj2741Offside
    hdu: 1426 ( Sudoku Killer )
    悲剧的矩阵乘法
    UVa729 The Hamming Distance Problem
    hdu 1584 蜘蛛牌
    zoj2972Hurdles of 110m
    hdu 1372 ( Knight Moves ) BFS
    UVa193Graph Coloring
    zjut1624序列问题
  • 原文地址:https://www.cnblogs.com/orchid-sky/p/3645670.html
Copyright © 2011-2022 走看看