词法分析
1.lex.l文件
%{
#include "stdio.h"
#include "trans.tab.h"//一定要添加该头文件,和后面的语法分析配合
%}
DIGIT [0-9] //申明DIGIT的正则表达式
%%//以上均是申明
{DIGIT}+ { yylval = atoi(yytext); return NUM;} /*printf("int: %s(%d)\n",yytext,atoi(yytext));}*/
\n { return END; }
"+" { return ADD; }
"-" { return MINUS;}
"*" { return MUL; }
"/" { return DIV;}
%%//以上均是正则表达式
int yywrap()
{ return 1; }
如果只要词法分析,代码可以有如下修改
%{
#include "stdio.h"
#include "trans.tab.h"//一定要添加该头文件,和后面的语法分析配合
%}
DIGIT [0-9] //申明DIGIT的正则表达式
%%//以上均是申明
{DIGIT}+ { yylval = atoi(yytext); return NUM;} /*printf("int: %s(%d)\n",yytext,atoi(yytext));}*/
\n { return END; printf("换行符");}
"+" { return ADD; printf("运算符:“+”");}
%%//以上均是正则表达式
int yywrap()
{ return 1; }
词法分析
1.文法
input -> input line |
line -> '\n' | E '\n'
E -> T | E add T | E minus T
T -> F | T mul F | T div F
F -> (E) | NUM
2.创建trans.y文件
申明部分
%{
#include "lex.yy.c"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <malloc.h>
//语法树的结构
typedef char* ElemType;
int i;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lChild, *mChild, *rChild;
}BiTNode, *BiTree;
typedef struct Node{
BiTNode *data;
struct Node *next;
}Node, *LinkedList;
void yyerror (char const *);
//创建链表
LinkedList LinkedListInit()
{
Node *L;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
return L;
}
//插入节点,头插法
LinkedList LinkedListInsert(LinkedList L,BiTNode *x)
{
Node *pre;
pre = L;
Node *p;
p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = pre->next;
pre->next = p;
return L;
}
//创建叶子
BiTree createLeaf(ElemType root)
{
BiTree T = (BiTree)malloc(sizeof(BiTNode));
if (T != NULL) {
T->data = root;
T->lChild = NULL;
T->mChild = NULL;
T->rChild = NULL;
}
else exit(-1);
return T;
}
BiTree createTree(ElemType root, BiTree lleaf, BiTree mleaf, BiTree rleaf)
{
BiTree T = (BiTree)malloc(sizeof(BiTNode));
if (T != NULL) {
T->data = root;
T->lChild = lleaf;
T->mChild = mleaf;
T->rChild