为什么我生成的Flex / Bison解析器即使在规则中添加了语法,也会出现语法错误?

Ketan Deshpande

我正在尝试实现一个简单的flex / bison代码,它将像程序一样检查C,如下所示:

main(){
x = 3;
print x;
}

但是,当我将此输入提供给程序时,它无法与我在flex文件中提到的规则匹配。以下是我的flex和bison文件的代码:

计算

%{
#include <stdio.h>
#include <string.h>
#include "calc.tab.h"
int lineno = 1;
%}

digit   [0-9]+
id      [a-z][a-zA-Z0-9]*

%%
{digit}+    { yylval.num = atoi(yytext); return TOK_NUMBER; }
"main"      { return TOK_MAIN; }
"("         { return TOK_ORBRACKET; }
")"         { return TOK_CRBRACKET; }
"{"         { return TOK_OCBRACKET; }
"}"         { return TOK_CCBRACKET; }
"print"     { return TOK_PRINT; }
{id}        { sscanf(yytext, "%s", (yylval.index)); return TOK_VARIABLE; }
";"         { return TOK_SEMICOLON; }
"+"         { return TOK_ADD; }
"*"         { return TOK_MUL; }
"(-{digit}+)" { return TOK_NEGNUM; } 
"="         { return TOK_EQUAL; }
[ \t]+      { }
[ \n]+      { lineno++; }
.           { printf("Lexical error:'%c'\n", yytext[0]); }

%%

%{
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "calc.tab.h"

extern int lineno;
int variable_counter = 0;

/* Flex functions */
int yylex(void);
void yyerror(char *s);
void set_variable(char* var_name, int var_value);
int get_variable_value(char* var_name);
extern FILE* yyin;
%}

%union {
    char index[100];
    int num;
}

%token TOK_NUMBER TOK_MUL TOK_ADD TOK_NEGNUM TOK_EQUAL TOK_MAIN TOK_ORBRACKET TOK_CRBRACKET TOK_OCBRACKET TOK_CCBRACKET TOK_SEMICOLON TOK_PRINT TOK_VARIABLE

%code requires {
    struct symtable
    {
        char var_name[100];
        int var_value;
    };
}

%code {
    struct symtable symboltable[100];
    int pos = 0;
}

%type <num> expr TOK_NUMBER TOK_NEGNUM
%type <index> TOK_VARIABLE

%left TOK_ADD
%left TOK_MUL

%%

prog:
    TOK_MAIN TOK_ORBRACKET TOK_CRBRACKET TOK_OCBRACKET stmts TOK_CCBRACKET
;

stmts:
    | stmt TOK_SEMICOLON stmts
;

stmt:
    expr TOK_SEMICOLON
    | TOK_PRINT expr TOK_SEMICOLON      {   fprintf(stdout, "%d\n", $2);    }
    | assignment
;

expr:
    TOK_NUMBER                                  { $$ = $1; }
    | TOK_VARIABLE                              { $$ = get_variable_value($1); }
    | expr TOK_MUL expr                         { $$ = $1 * $3; }
    | expr TOK_ADD expr                         { $$ = $1 + $3; }
    | TOK_NEGNUM                                { $$ = -$1; }
    | TOK_ORBRACKET expr TOK_CRBRACKET          { $$ = $2; }
;

assignment:
    TOK_VARIABLE TOK_EQUAL expr { set_variable($1, $3); }
;

%%

void set_variable(char* var_name, int var_value) {
    int counter;
    bool found = false;
    for (counter = 0; counter<=variable_counter; counter++) {
        if (strcmp(var_name, symboltable[counter].var_name) == 0) {
            found = true;
            break;
        }
    }

    if(!found) {
        strcpy(symboltable[counter].var_name, var_name);
        symboltable[counter].var_value = var_value;
        variable_counter++;
    }
}

int get_variable_value(char* var_name) {
    int counter;
    for (counter = 0; counter<=variable_counter; counter++) {
        if (strcmp(var_name, symboltable[counter].var_name) == 0) {
            return symboltable[counter].var_value;
        }
    }
}

void yyerror(char *s)
{
    fprintf(stderr, "Parsing error: line %d and %s\n", lineno, s);
}

int main(int argc,char* argv[])
{
    if(argc==1) {
        printf("\nPlease provide an input file name. Exiting...\n");
        return 0;
    }

    yyin = fopen(argv[1], "r");
    if (!yyin) {
        printf("ERROR: Couldn't open file %s\n", argv[1]);
        return -1;
    } 

    yyparse();
    return 0;
}

它显示为:

'exical error:'
'exical error:'
3
'exical error:'
Parsing error: line 4 and syntax error

在此先感谢您的帮助。

Ctx

两个问题:

消息'exical error:'来自\r\n已解析文件中的DOS样式的行尾。您应该将其转换为\n结尾,也可以\r在解析器中使用字符,例如通过扩展规则

[ \t]+      { }

[ \t\r]+      { }

该消息Parsing error: line 4 and syntax error来自解析器中的逻辑缺陷。这里

stmts:
    | stmt TOK_SEMICOLON stmts
;

您指定每个stmt都以分号结尾。但在这里

stmt:
    expr TOK_SEMICOLON
    | TOK_PRINT expr TOK_SEMICOLON      {   fprintf(stdout, "%d\n", $2);    }
    | assignment
;

之后需要使用分号所以这行之后需要两个分号exprTOK_PRINT expr

print x;;

但是您可能希望TOK_SEMICOLON像这样删除多余的内容

stmt:
    expr
    | TOK_PRINT expr      {   fprintf(stdout, "%d\n", $2);    }
    | assignment
;

然后,您的文件应按预期进行解析。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果我不在AWK的END块中写'if',为什么会出现语法错误?

来自分类Dev

如果我不在AWK的END块中写'if',为什么会出现语法错误?

来自分类Dev

Flex / Bison语法错误

来自分类Dev

Flex / Bison语法错误

来自分类Dev

Access 2013:为什么会出现此语法错误?

来自分类Dev

为什么会出现语法错误:缺少';' 在“ *”之前

来自分类Dev

为什么使用exec()会出现语法错误?

来自分类Dev

为什么会出现“ INSERT INTO语句中的语法错误”?

来自分类Dev

为什么重启后会出现语法错误?

来自分类Dev

为什么会出现错误:语法错误,意外的“ in_array”?我试图找出变量是否在数组中

来自分类Dev

简单的解析器 - 当 len(tokens) 大于 0 时,为什么会引发“语法错误”?

来自分类Dev

尝试将if语句放入触发器时,为什么会出现语法错误?

来自分类Dev

为什么使用装饰器工厂工厂函数会出现语法错误?

来自分类Dev

为什么我的解析器生成此LALR(1)语法不是LALR(1)的报告?

来自分类Dev

如果在控制台中运行此语法,为什么会出现语法错误?{} === {}

来自分类Dev

如何计算bison-flex中的语法错误

来自分类Dev

为什么我的哈希始终出现语法错误?

来自分类Dev

为什么我在 LAG() 函数中出现语法错误?

来自分类Dev

Flex/bison 不断给我语法错误

来自分类Dev

破折号:当我的脚本甚至不包含反引号时,为什么会出现错误“语法错误:EOF在反引号中”?

来自分类Dev

当我尝试将变量放入Xpath时,为什么每次都会出现语法错误

来自分类Dev

当我尝试打印包含带有冒号的键的嵌套哈希时,为什么会出现语法错误?

来自分类Dev

为什么会出现此错误?“令牌“实现”的语法错误,@预期”

来自分类Dev

为什么会出现此错误?语法错误:丢失;声明前

来自分类Dev

为什么会出现错误?(语法错误,意外的keyword_true)

来自分类Dev

如何在 flex/bison 中编写复杂的语法解析器并将其连接为 vim 插件?

来自分类Dev

创建FK时出现语法错误,我是否从sql server中的用户输入中正确添加了图片,或者有另一种方法

来自分类Dev

为什么我的函数中的数组参数出现语法错误?

来自分类Dev

为什么我在python中收到SQL语法错误

Related 相关文章

  1. 1

    如果我不在AWK的END块中写'if',为什么会出现语法错误?

  2. 2

    如果我不在AWK的END块中写'if',为什么会出现语法错误?

  3. 3

    Flex / Bison语法错误

  4. 4

    Flex / Bison语法错误

  5. 5

    Access 2013:为什么会出现此语法错误?

  6. 6

    为什么会出现语法错误:缺少';' 在“ *”之前

  7. 7

    为什么使用exec()会出现语法错误?

  8. 8

    为什么会出现“ INSERT INTO语句中的语法错误”?

  9. 9

    为什么重启后会出现语法错误?

  10. 10

    为什么会出现错误:语法错误,意外的“ in_array”?我试图找出变量是否在数组中

  11. 11

    简单的解析器 - 当 len(tokens) 大于 0 时,为什么会引发“语法错误”?

  12. 12

    尝试将if语句放入触发器时,为什么会出现语法错误?

  13. 13

    为什么使用装饰器工厂工厂函数会出现语法错误?

  14. 14

    为什么我的解析器生成此LALR(1)语法不是LALR(1)的报告?

  15. 15

    如果在控制台中运行此语法,为什么会出现语法错误?{} === {}

  16. 16

    如何计算bison-flex中的语法错误

  17. 17

    为什么我的哈希始终出现语法错误?

  18. 18

    为什么我在 LAG() 函数中出现语法错误?

  19. 19

    Flex/bison 不断给我语法错误

  20. 20

    破折号:当我的脚本甚至不包含反引号时,为什么会出现错误“语法错误:EOF在反引号中”?

  21. 21

    当我尝试将变量放入Xpath时,为什么每次都会出现语法错误

  22. 22

    当我尝试打印包含带有冒号的键的嵌套哈希时,为什么会出现语法错误?

  23. 23

    为什么会出现此错误?“令牌“实现”的语法错误,@预期”

  24. 24

    为什么会出现此错误?语法错误:丢失;声明前

  25. 25

    为什么会出现错误?(语法错误,意外的keyword_true)

  26. 26

    如何在 flex/bison 中编写复杂的语法解析器并将其连接为 vim 插件?

  27. 27

    创建FK时出现语法错误,我是否从sql server中的用户输入中正确添加了图片,或者有另一种方法

  28. 28

    为什么我的函数中的数组参数出现语法错误?

  29. 29

    为什么我在python中收到SQL语法错误

热门标签

归档