使用yacc生成编译器的时候,使用bison处理.y文件时总是出现如下报错,这些文件夹在我安装bison和flex的地方都有但是他就是只读这个路径,环境变量我也已经在path添加了安装路径
m4: cannot open Windows\Bison/share/bison': No such file or directory m4: cannot open
E:\lex1\Flex': Permission denied
m4: cannot open `Windows\Bison/share/bison/m4sugar/m4sugar.m4': No such file or directory
下面是.y文件的内容
%{
#include <stdio.h>
#include <stdlib.h>
// 定义语法树节点结构体
typedef struct TreeNode {
int nodeType;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建语法树节点的函数
TreeNode* createNode(int nodeType, TreeNode* left, TreeNode* right) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->nodeType = nodeType;
newNode->left = left;
newNode->right = right;
return newNode;
}
// 打印语法树的函数
void printTree(TreeNode* root, int level) {
if (root == NULL) return;
for (int i = 0; i < level; ++i) printf(" ");
printf("Node Type: %d\n", root->nodeType);
printTree(root->left, level + 1);
printTree(root->right, level + 1);
}
#define BISON_PATH "E:\lex1\Flex Windows\Bison"
#define FLEX_PATH "E:\lex1\Flex Windows\Lex\bin"
%}
// 定义词法单元类型
%union {
int intval;
char* id;
TreeNode* node;
}
// 定义词法单元
%token PROGRAM TYPE VAR PROCEDURE BEGIN END IF THEN ELSE FI WHILE DO ENDWH READ WRITE RETURN
%token INTEGER CHAR ARRAY RECORD OF ID INTC
%token ADD SUB MUL DIV LT EQ
%token LPAREN RPAREN LBRACKET RBRACKET DOT COMMA SEMICOLON ASSIGN
%type <node> Program ProgramHead ProgramName DeclarePart TypeDec TypeDeclaration TypeDecList TypeDecMore TypeId TypeName BaseType StructureType ArrayType Low Top RecType FieldDecList FieldDecMore IdList IdMore VarDec VarDeclaration VarDecList VarDecMore VarIdList VarIdMore ProcDec ProcDeclaration ProcDecMore ProcName ParamList ParamDecList ParamMore Param FormList FidMore ProcDecPart ProcBody ProgramBody StmList StmMore Stm AssCall AssignmentRest ConditionalStm LoopStm InputStm Invar OutputStm ReturnStm CallStmRest ActParamList ActParamMore RelExp OtherRelE Exp OtherTerm Term OtherFactor Factor Variable VariMore FieldVar FieldVarMore CmpOp AddOp MultOp
%%
// 文法规则部分
Program:
ProgramHead DeclarePart ProgramBody { printTree($1, 0); }
;
ProgramHead:
PROGRAM ProgramName
;
ProgramName:
ID
;
DeclarePart:
TypeDec VarDec ProcDec
;
TypeDec:
/* empty */
| TypeDeclaration
;
TypeDeclaration:
TYPE TypeDecList
;
TypeDecList:
TypeId ASSIGN TypeName SEMICOLON TypeDecMore
;
TypeDecMore:
/* empty */
| TypeDecList
;
TypeId:
ID
;
TypeName:
BaseType
| StructureType
| ID
;
BaseType:
INTEGER
| CHAR
;
StructureType:
ArrayType
| RecType
;
ArrayType:
ARRAY LBRACKET Low DOT DOT Top RBRACKET OF BaseType
;
Low:
INTC
;
Top:
INTC
;
RecType:
RECORD FieldDecList END
;
FieldDecList:
BaseType IdList SEMICOLON FieldDecMore
| ArrayType IdList SEMICOLON FieldDecMore
;
FieldDecMore:
/* empty */
| FieldDecList
;
IdList:
ID IdMore
;
IdMore:
/* empty */
| COMMA IdList
;
VarDec:
/* empty */
| VarDeclaration
;
VarDeclaration:
VAR VarDecList
;
VarDecList:
TypeName VarIdList SEMICOLON VarDecMore
;
VarDecMore:
/* empty */
| VarDecList
;
VarIdList:
ID VarIdMore
;
VarIdMore:
/* empty */
| COMMA VarIdList
;
ProcDec:
/* empty */
| ProcDeclaration
;
ProcDeclaration:
PROCEDURE ProcName LPAREN ParamList RPAREN SEMICOLON ProcDecPart ProcBody ProcDecMore
;
ProcDecMore:
/* empty */
| ProcDeclaration
;
ProcName:
ID
;
ParamList:
/* empty */
| ParamDecList
;
ParamDecList:
Param ParamMore
;
ParamMore:
/* empty */
| SEMICOLON ParamDecList
;
Param:
TypeName FormList
| VAR TypeName FormList
;
FormList:
ID FidMore
;
FidMore:
/* empty */
| COMMA FormList
;
ProcDecPart:
DeclarePart
;
ProcBody:
ProgramBody
;
ProgramBody:
BEGIN StmList END
;
StmList:
Stm StmMore
;
StmMore:
/* empty */
| SEMICOLON StmList
;
Stm:
ConditionalStm
| LoopStm
| InputStm
| OutputStm
| ReturnStm
| ID AssCall
;
AssCall:
AssignmentRest
| CallStmRest
;
AssignmentRest:
VariMore ASSIGN Exp
;
ConditionalStm:
IF RelExp THEN StmList ELSE StmList FI
;
LoopStm:
WHILE RelExp DO StmList ENDWH
;
InputStm:
READ LPAREN Invar RPAREN
;
Invar:
ID
;
OutputStm:
WRITE LPAREN Exp RPAREN
;
ReturnStm:
RETURN LPAREN Exp RPAREN
;
CallStmRest:
LPAREN ActParamList RPAREN
;
ActParamList:
/* empty */
| Exp ActParamMore
;
ActParamMore:
/* empty */
| COMMA ActParamList
;
RelExp:
Exp OtherRelE
;
OtherRelE:
CmpOp Exp
;
Exp:
Term OtherTerm
;
OtherTerm:
/* empty */
| AddOp Exp
;
Term:
Factor OtherFactor
;
OtherFactor:
/* empty */
| MultOp Term
;
Factor:
LPAREN Exp RPAREN
| INTC
| Variable
;
Variable:
ID VariMore
;
VariMore:
/* empty */
| LBRACKET Exp RBRACKET
| DOT FieldVar
;
FieldVar:
ID FieldVarMore
;
FieldVarMore:
/* empty */
| LBRACKET Exp RBRACKET
;
CmpOp:
LT
| EQ
;
AddOp:
ADD
| SUB
;
MultOp:
MUL
| DIV
;
%%
int main() {
yyparse();
return 0;
}
int yyerror(char *s) {
fprintf(stderr, "Error: %s\n", s);
return 0;
}
<!-- int yylex() {
// 词法分析器的实现
// 这里需要根据具体的词法规则实现
return 0;
} -->