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'

  • 相关阅读:
    idea导入项目没有run方法,是java文件
    idea好用的插件
    各种路径
    HandlerInterceptorAdapter
    自定义httpservletrequest解析参数
    idea类存在找不到解决办法
    坦言spring中事务、重试、异步执行注解
    IntelliJ IDEA 超实用使用技巧分享
    mysql插入数据频繁出现坏表
    在开发中进入一个方法后想要到原来那行 ctrl+alt+左 回到上一步 ctrl+alt+右 回到下一步
  • 原文地址:https://www.cnblogs.com/orchid-sky/p/3645670.html
Copyright © 2011-2022 走看看