Quantiverse Josetar 2024-06-06 14:55 采纳率: 66.7%
浏览 2

使用lex yacc生成语法分析器时读不到路径

使用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;
} -->

  • 写回答

1条回答 默认 最新

  • 阿里嘎多学长 2024-06-06 14:55
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    从您提供的错误信息来看,问题主要出在m4无法找到正确的文件路径以及权限问题上。以下是针对您提出的问题的一些建议和解决方案:

    为什么m4无法打开Windows\Bison/share/bisonE:\lex1\Flex

    1. 路径错误:错误信息显示Windows\Bison/share/bison,这似乎是一个路径错误。通常,路径中的Windows前不需要加反斜杠\。正确的路径可能是Windows/Bison/share/bison或者C:/Windows/Bison/share/bison(取决于您的安装位置)。

    2. 路径不存在:确保BisonFlex的安装路径确实存在,并且m4有权限访问这些路径。

    为什么m4在尝试打开Windows\Bison/share/bison/m4sugar/m4sugar.m4时显示权限被拒绝?

    1. 权限问题:这通常意味着当前用户没有足够的权限去读取或执行该文件。您可以尝试以管理员身份运行命令行工具,或者修改文件的权限。

    2. 路径问题:同上,路径可能存在错误,需要检查并更正。

    如何确保环境变量正确设置?

    1. 检查环境变量:确保PATH环境变量包含了bisonflex的可执行文件路径。例如,如果bison安装在C:\Program Files\Bison,那么您需要将这个路径添加到PATH中。

    2. 使用绝对路径:在您的.y文件中,您已经定义了BISON_PATHFLEX_PATH。确保这些宏定义的路径是正确的,并且是绝对路径。

    3. 重新启动命令行:在修改环境变量后,您需要重新启动命令行工具,以确保新的环境变量设置生效。

    代码实现

    在您的.y文件中,您已经尝试定义了BISON_PATHFLEX_PATH。您需要确保这些路径是正确的,并且与您的系统环境相匹配。例如:

    #define BISON_PATH "C:/Program Files/Bison"
    #define FLEX_PATH "C:/Program Files/Flex"
    

    请根据您的实际安装路径进行修改。

    参考资料

    总结

    解决这个问题需要您检查并确保以下几点:

    • 路径定义正确,没有语法错误。
    • 文件和目录确实存在于指定的路径下。
    • 当前用户有足够的权限访问这些文件和目录。
    • 环境变量PATH正确设置,并且命令行工具已经重新启动以应用这些更改。

    希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多的信息,以便进一步分析和解决。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月6日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表