Tag: lex

如何从lex / yacc获取更多解析错误信息?

如何从lex / yacc获取更多解析错误信息? 目前在我正在使用的lex文件中: int yyerror(const char *msg) { fprintf(stderr, “Parse error: %s\n”, msg); return 0; } 但是当我运行我的程序时,yyerror会输出一条空白消息。 我尝试将yylineno和yytext添加到yyerror但这会导致编译错误。 我尝试将“%error-verbose”添加到yacc文件,并将“%option debug”添加到lex文件,但这些对消息没有任何影响。 我确实注意到yyparse输出一个括号:'{‘来自我试图解析的文件,我不知道这个的意义。 我正在使用win_flex和win_bison。

Flex和Bison:使用特定关键字开始一个句子

我正在使用Flex和Bison开发一个程序。 我的任务可以仅使用Flex(使用开始条件等)完成,但我已经明白使用Bison可能会让我的生活更轻松。 我的任务是设计一个识别编程语言声明部分的程序。 通过下面的代码可以理解它的语法和逻辑。 我的问题是,我希望我的程序能够将代码的每个部分识别为可接受的声明部分,该部分仅以 “ var ”关键字开头! 到现在为止,我还没有成功。 我怎么能成功呢? 我在我的.l(flex)和.y(野牛)文件下面。 exercise4.l %{ #include %} %% [ \t\n]+ { /* Ignore all whitespaces */ } “;” { /* Ignore all semicolons */ } “:” { /* Ignore all colons */ } var { printf(“A keyword: %s\n”,yytext); return VAR; } real { printf(“A variable type: %s\n”,yytext); […]

如何在Lex和Yacc中对String进行标记

参考我们正在使用的LEX YACC lex文件中的读取新行给出语法错误 %{ /* parser for ssa; */ #include #include #include”y.tab.h” %} %% [\t]+ ; \n ; [if]+ printf(“first input\n”); [else]+ return(op); [=]+ return(equal); [+]+ return(op); [*]+ return(op); [-]+ return(op); [\] {return(bblock);} ([[_][az]])|([az][_][0-9]+)|([0-9]+) {return(var);} . ; %% 如果我想将令牌作为字符串,即a_2如何做,我该怎么办? 输入文件是 a_2 = _6 + b_3; a_8 = b_7 – c_5;

词法分析在yy_scan_string()完成后停止

我用flex来制作一个词法分析器。 我想分析一些定义编译器语句,其forms为:#define identifier identifier_string。 我保留了(标识符identifier_string)对的列表。 因此,当我在文件中到达#define list的标识符时,我需要从主文件切换词法分析以分析相应的identifier_string。 (我没有把完整的flex代码因为太大了)这是部分: {IDENTIFIER} { // search if the identifier is in list if( p = get_identifier_string(yytext) ) { puts(“DEFINE MATCHED”); yypush_buffer_state(yy_scan_string(p)); } else//if not in list just print the identifier { printf(“IDENTIFIER %s\n”,yytext); } } <> { puts(“EOF reached”); yypop_buffer_state(); if ( !YY_CURRENT_BUFFER ) { yyterminate(); } loop_detection = […]

如何在C中使用unicode字符?

我用C语言编写了一个Lexer,它目前成功地将ASCII文件作为lexes,但是我对如何使用unxode感到困惑。 我需要什么unicode lex,例如我应该支持utf-8,utf-16等.Rust或Go等语言支持什么? 如果是这样,有任何图书馆可以帮助我,虽然我宁愿尝试自己做,所以我可以学习。 即便如此,我可以阅读的小型图书馆也很棒。

从另一个c文件中调用Yacc文件中的函数

我是Lex / Yacc编程的新手。 我有一个关于如何从另一个C文件调用Yacc文件中的函数的问题。 假设我有以下Lex / Yacc代码: calc.l %{ #include “y.tab.h” extern int yylval; %} %% [0-9]+ { yylval=atoi(yytext); return NUMBER;} [ \t]; \n return 0; . return yytext[0]; %% calc.y %{ #include %} %token NAME NUMBER %% statement: NAME ‘=’ expression | expression {printf(“= %d\n”,$1); printf(“yylval= %d”,yylval);} ; expression: NUMBER ‘+’ NUMBER {$$=$1+$3;} | […]

使用makefile从lex文件生成a.out

我有auto.lex ,我想生成此文件的a.out 。 我试过了 – a.out: lex.yy.c gcc -c lex.yy.c lex.yy.c: auto.lex flex -c auto.lex 但它不起作用。 编辑: 变成 – a.out: lex.yy.c gcc lex.yy.c lex.yy.c: auto.lex flex auto.lex 并修复。

从stdin到文件的Flex / Bison EOF传播

我有一个扫描仪,解析器和一个main,我通过它创建一个可执行文件 bison -d parser.y; flex scanner.l; gcc main.c parer.tab.c lex.yy.c 当我运行./a.out它会按照我想要的方式执行操作:如果Ctrl+D则会检测到EOF ,并且main可以相应地执行操作。 这意味着:如果yyin是stdin那么点击Return结束该行的解析,主循环等待下一个输入行。 按Ctrl+D结束主循环中的break解析输入并退出。 如果输入来自一个文件,e,g, testFile该文件可以包含1个要解析的表达式,直到EOF。 在文件场景中,新行应该像空格和制表符一样被吃掉。 当输入来自stdin时,所有这些应该像解释器一样,当输入来自文件时,它应该像脚本评估器一样。 这种测试文件的示例内容是: test\n 。 这里未检测到EOF。 我很难理解为什么会这样。 换句话说,我想在这里扩展问题,以便另外使用输入文件 parser.y: %{ #include #include #include /* stuff from flex that bison needs to know about: */ int yylex(); int yyparse(); FILE *yyin; static int parseValue; void yyerror(const char *s); %} %token […]

如何从lex / yacc生成不同的yyparse函数以在同一程序中使用?

我想从lex / yacc生成两个单独的解析函数。 通常yacc会为你提供一个函数yyparse(),当你需要进行一些解析时,你可以调用它,但是我需要有几个不同的yyparses,每个yypars都与不同的词法分析器和语法相关联。 手册页似乎建议使用-p(前缀)标志,但这对我不起作用。 我从gcc那里得到错误,表明yylval没有被正确地重新标记(即它声称没有定义几个不同的令牌)。 有谁知道生成这些单独函数的一般rpocedure? 谢谢

野牛与yyerror的冲突类型

我正在尝试从flex和bison制作计算器,但我在编译期间发现了一个错误。 这是错误: C:\GnuWin32\src>gcc lex.yy.c y.tab.c -o tugas tugas.y:51: error: conflicting types for ‘yyerror’ y.tab.c:1433: error: previous implicit declaration of ‘yyerror’ was here 这是我的.l代码: %{ #include #include “y.tab.h” YYSTYPE yylval; %} plus [+] semi [;] minus [-] var [az] digit [0-1]+ equal [:=] %% {var} {yylval = *yytext – ‘a’; return VAR;} {digit} {yylval = atoi(yytext); […]