对应虎书第2章。chap3例程。

1、windows已安装mingw和flex:
2、下载bison,并修改环境变量,选择安装目录时,路径中不能带有空格和中文
3、开启调试模式:在tiger.grm中加入int yydebug =1;
2、cmd使用命令将tiger.grm生成为.c.h文件:
bison -l --defines=y.tab.h --report=all --report-file=my.report --output=y.tab.c tiger.grm   --debug
3、不使用提供的lex.yy.c,使用自己的tiger.lex,生成lex.yy.c文件:flex my_tiger.lex
4、依次输入如下命令,或创建批处理文件:
gcc -g -c util.c
gcc -g -c lex.yy.c
gcc -g -c errormsg.c
gcc -g -c y.tab.c
gcc -g -c parsetest.c
这里可能有报waring,在开头添加#include <stdlib.h>,可取消waring
gcc -g -o mytest.exe parsetest.o y.tab.o lex.yy.o errormsg.o util.o
5、测试,找一个tiger程序文件“test2.tig”,输入mytest.exe test2.tig,可看到输出,此时的语法分析器的功能只能识别ID,无其它功能。

下面是我写的tiger语法分析和测试用代码,testcases内的文件除tiger49.tig(这个文件本身有错)全部通过:

测试运行用代码parsetest.c(可读取一个目录下所有tig文件进行测试):

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
#include "util.h"
#include "errormsg.h"

extern int yyparse(void);

void parse(string fname) 
{EM_reset(fname);
 if (yyparse() == 0) /* parsing worked */
   printf("Parsing successful!\n");
 else printf("Parsing failed\n");
}

int main(int argc, char **argv) {
 DIR *dp;
 struct stat buf;
 struct dirent *dirp;
 char dirname[256];
 if (argc<2) {fprintf(stderr,"usage: a.out filename\n"); exit(1);}
  for (int c=1; c < argc; c++) {
        printf("next:%s\r\n ", argv[c]);
if (stat(argv[c], &buf) < 0) {
            printf("lstat error: %s\n", strerror(errno));
            continue;
        }

if (S_ISDIR(buf.st_mode)) {
printf("directory: %s\r\n",argv[c]);
if((dp = opendir(argv[c]))==NULL) {
fprintf(stderr,"Err:Can't open.");
continue;
}

while((dirp = readdir(dp))!=NULL){
printf("current file:%s.\r\n",dirp->d_name);
if(strlen(dirp->d_name) >4){
for(int i=0;i<=(strlen(dirp->d_name)-4);i++){
if(strncmp(&dirp->d_name[i],".tig",4)==0) {
strcpy(dirname,argv[c]);
strcat(dirname,"\\");
strcat(dirname,dirp->d_name);
parse(dirname);
}
}
}
}
closedir(dp);
}
else if(S_ISREG(buf.st_mode)){
parse(argv[c]);
}

}
 
 return 0;
}

语法分析文件tiger_my.grm:

%{
#include <stdio.h>
#include "util.h"
#include "errormsg.h"

int yylex(void); /* function prototype */

void yyerror(char *s)
{
 EM_error(EM_tokPos, "%s", s);
}
//生成的程序会开启调试输出:输出状态转换过程
int yydebug =1;
%}

%union {
int pos;
int ival;
string sval;
}

%token <sval> ID STRING
%token <ival> INT

%token 
  COMMA COLON SEMICOLON LPAREN RPAREN LBRACK RBRACK 
  LBRACE RBRACE DOT 
  PLUS MINUS TIMES DIVIDE EQ NEQ LT LE GT GE
  AND OR ASSIGN
  ARRAY IF THEN ELSE WHILE FOR TO DO LET IN END OF 
  BREAK NIL
  FUNCTION VAR TYPE UMINUS
  
%start program

%nonassoc OF DO 
%left THEN 
%right ELSE

%nonassoc ASSIGN
%left AND OR 
%nonassoc EQ NEQ LT GT LE GE
%left PLUS MINUS
%left TIMES DIVIDE

%right UMINUS

%%

program: exp
;

decs: dec
|decs dec
;

dec: typedec
|vardec
|fundec
;

typedec: TYPE ID EQ ty
;
ty: ID
|LBRACE tyfields RBRACE
|ARRAY OF ID
;
tyfields: tyfield
|tyfields COMMA tyfield
;
tyfield: ID COLON ID
;

vardec: VAR ID ASSIGN exp
|VAR ID COLON ID ASSIGN exp
;

fundec: FUNCTION ID LPAREN tyfields  RPAREN EQ exp
|FUNCTION ID LPAREN tyfields  RPAREN COLON ID EQ exp
|FUNCTION ID LPAREN RPAREN EQ exp
|FUNCTION ID LPAREN RPAREN COLON ID EQ exp
;

lvalue: ID  
|ID LBRACK exp RBRACK 
|lvalue DOT ID 
|lvalue LBRACK exp RBRACK  
;

exp: LPAREN RPAREN
|LPAREN expseq RPAREN

|LET decs IN END
|LET IN END
|LET decs IN expseq END
|LET IN expseq END

|lvalue ASSIGN exp

|IF exp THEN exp
|IF exp THEN exp ELSE exp

|WHILE exp DO exp
|FOR ID ASSIGN exp TO exp DO exp
|BREAK

|lvalue
|NIL
|INT
|STRING
|MINUS exp  %prec UMINUS

|ID LPAREN RPAREN
|ID LPAREN exps_para RPAREN

|exp PLUS exp
|exp MINUS exp
|exp TIMES exp
|exp DIVIDE exp

|exp EQ exp
|exp NEQ exp
|exp LT exp
|exp LE exp
|exp GT exp
|exp GE exp
|exp AND exp
|exp OR exp

|ID LBRACE RBRACE
|ID LBRACE exps_assign RBRACE
|ID LBRACK exp RBRACK OF exp
;

expseq: exp
|expseq SEMICOLON exp
;

exps_para: exp
|exps_para COMMA exp
;

exps_assign: ID EQ exp
|exps_assign COMMA ID EQ exp
;

在运行测试时,会输出较多的调试信息,可使用mytest.exe test2.tig 2>my2.report ,将调试信息输出至文本。

tiger语法分析-修改相关推荐

  1. oracle修改scott密码

    set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK                                                 ---设置这个,否则容易乱 ...

  2. Linux下Sed命令的用法(之替换)

    Linux 操作系统最大的一个好处是它带有各种各样的实用工具.存在如此之多不同的实用工具,几乎不可能知道并了解所有这些工具.可以简化关键情况下操作的一个实用 工具是 sed.它是任何管理员的工具包中最 ...

  3. oracle的用户账号密码设置

    1. 可以用sqlplus system/你输入的密码 可以用sqlplus /nolog 可以用sqlplus /as sysdba 2. @你scott.sql的路径 3. 修改你的账号 alte ...

  4. 解决Navicat使用账号密码登陆Oracle数据库提示【密码已过期,请输入新密码】【或账号已被锁定】

    一.问题描述 打开Navicat使用对应的账号密码登陆Oracle时,弹出提示框[密码已经过期,请输入新密码]:但是自己按照提示输入正确的旧密码和设置对应的新密码后无法修改成功提示[ORA-01017 ...

  5. oracle相关介绍

    数据库存储数据结构 网状结构 层次结构 二维表结构:二维表结构可以清晰的将数据与数据之间的关系表述清楚 数据库管理系统 oracle:大型数据库管理系统 mysql:中小型 DB2:中小型 Acess ...

  6. oracle学习日志(一)

    Oracle: 全称 - 甲骨文股份有限公司,全球第二大软件公司,但在数据库领域,Oracle无争议的第一,Oracle数据库比较重要的几个产品: Oracle 8i/9i - internate O ...

  7. 【Antlr】使用语义判定修改语法分析过程

    文章目录 1.概述 2.识别编程语言中的多种方言 2.案例 2.1 完整案例 1.概述 上一篇文章: [Antlr]Antlr属性和动作-识别关键字不固定的语句 出自:antlr 权威指南 并且补充 ...

  8. 自顶向下的语法分析(修改)

    自顶向下语法分析可以被看作是为输入串构造语法分析树的问题,它从语法分析树的根结点开始 ,按照先序遍历创建这棵语法分析树的各个结点.自顶向下语法分析也可以被看作寻找输入串的最左推导的过程. 递归下降的语 ...

  9. xcode修改时间后就要重新编译_iOS 微信编译速度优化分享

    前言 岁月真是个养猪场,这几年,人胖了,微信代码也翻了.记得 14 年转岗来微信时,用自己笔记本编译微信工程才十来分钟.如今用公司配的 17 年款 27-inch iMac 编译要接近半小时:偶然间更 ...

最新文章

  1. 赋能‘元宇宙’,这些企业强势破圈 | 2021AI 最佳成长榜
  2. .NET Core迁移前的准备工作
  3. js动态添加控件服务器响应,JS实现动态给标签控件添加事件的方法示例
  4. 【学习笔记】网络层——无分类编址CIDR、ARP协议、DHCP协议和ICMP协议
  5. 失败创业者的告白:初创团队应有一位绝对领导者
  6. 【Vue】v-bind v-model指令的使用(实现计算器效果)
  7. php screw.so扩展下载,CentOS下安装php加解密工具php
  8. M study summarize
  9. linux装逼指南-数字雨
  10. java毕业生简历_一个18年毕业生的Java简历
  11. python基础教程doc_python基础教程之Word Cloud (词云) - Python|python基础教程|python入门|python教程...
  12. “辣条大王”卫龙奔向港交所 能否撑起600亿估值?
  13. flowable审批流+集成springboot
  14. c语言isfinite用法,C# Double.IsFinite()用法及代码示例
  15. 北理工计算机学院隋秀峰,吴俊敏(计算机科学与技术学院)老师 - 中国科学技术大学 - 院校大全...
  16. Android MediaPlayer使用注意
  17. Review KD(2)
  18. 五点三次平滑滤波在消除随机噪声中的应用以及其Maltab程序
  19. 小情侣冷战到半夜!不料程序员男友一波“神操作”巧妙化解,女友懵了.........
  20. Razer Fintech 委任林祥源先生为顾问委员会成员

热门文章

  1. Linux 学习--一篇就学懂Linux(万字长文)
  2. Vijos P1881 闪烁的星星
  3. Topaz Gigapixel AI 4.1.2 特别版 Mac 图片无损放大软件
  4. 前缀表达式/中缀表达式/后缀表达式
  5. C语言 获取网页内容
  6. 小程序behaviors使用笔记
  7. 自动驾驶(七十四)---------硬件平台介绍
  8. 【家庭财务管理系统】
  9. Python中numpy库中 axis=0,axis= 1轴的详解
  10. 基于JavaEE的网上水果销售管理系统