使用gcc和-Wall选项编译我的项目时,我收到一条警告,说明在我的flex文件的不存在的最后一行中没有效果的语句:
警告:
gcc -Wall -O0 -ggdb3 -DNOSUDO -DJOBC -DDEBUG -c lex.yy.c
tokenizer.l: In function ‘yylex’:
tokenizer.l:179: warning: statement with no effect
Run Code Online (Sandbox Code Playgroud)
Shell命令:
$ wc -l tokenizer.l
178 tokenizer.l
Run Code Online (Sandbox Code Playgroud)
lex文件的最后一部分:
; {
    return SEMI;
}
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么我会收到这个警告?
如果我压制所有#line指令,则错误为:
lex.yy.c: In function ‘yylex’:
lex.yy.c:1021: warning: statement with no effect
Run Code Online (Sandbox Code Playgroud)
其中指的是ECHO线:
case 30:
YY_RULE_SETUP
ECHO;
    YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(inQuote):
case YY_STATE_EOF(inWord):
    yyterminate();
Run Code Online (Sandbox Code Playgroud) 我正在阅读O'Reilly的Flex&Bison,并想知道预先学习正则表达式是否有助于开发编程语言?
我想知道如何使用调用yyparse的Makefile正确编译程序?
这就是我做的:
我有我的编译所有的常规文件Makefile文件,他们必须y.tab.c的或不lex.yy.c中连接(我应该让他们?)
我在我的代码之上执行此操作:
#include "y.tab.c"
#include "lex.yy.c"
#include "y.tab.h"
Run Code Online (Sandbox Code Playgroud)
当我尝试制作程序时会发生这种情况:
当我输入"make"时,它会给我很多警告.一些例子如下所示.
在函数yywrap':
/src/parser.y:12: multiple definition ofyywrap'server.o:/src/parser.y:12:首先在这里定义utils.o:
在函数yyparse':
/src/y.tab.c:1175: multiple definition ofyyparse'server.o:/src/y.tab.c:1175:首先在这里定义utils.o
我得到许多不同的错误,指的是不同的yy _***文件.我已成功编译过去多次调用yyparse,但这次似乎有所不同.这似乎非常像一个包含问题,但我不知道它是什么.我的所有头文件都有ifndef条件.
谢谢你的帮助!
如何自定义flex的默认操作.我找到了类似<*>的东西,但是当我运行它时会说"flex scanner被卡住"?还有.规则只添加一个规则,因此它也不起作用.我想要的是
comment               "/*"[^"*/"]*"*/"
%%
{comment}             return 1;
{default}             return 0; 
<<EOF>>               return -1;
Run Code Online (Sandbox Code Playgroud)
是否可以更改匹配最长的行为以匹配第一个?如果是这样,我会做这样的事情
default               (.|\n)*
Run Code Online (Sandbox Code Playgroud)
但因为这几乎总是给出一个更长的匹配,它将隐藏评论规则.
编辑
我在手册中找到了{ - }运算符,但是这个直接来自手册的例子给了我"未记录的规则":
[AC] { - } [BZ]
我正在开发一个有趣的汇编程序,用C,flex,bison编写.我想添加宏,包含和重复块,并考虑使用单独的预处理阶段解析器执行此操作.
我的问题是,我如何跟踪原始源代码行(和文件名)?这用于生成有用的错误消息,漂亮的打印和生成调试信息.
预处理完成后第二个解析器中的yylineno可能会在宏扩展后偏移,依此类推.
下面是一个 FLEX 程序的片段
%%
a     |
ab    |
abc   |
abcd  ECHO; REJECT;
.|\n  printf("xx%c", *yytext);
%%
Run Code Online (Sandbox Code Playgroud)
输入:
abcd
Run Code Online (Sandbox Code Playgroud)
输出:
abcdabcabaxxaxxbxxcxxdxx
Run Code Online (Sandbox Code Playgroud)
有人可以解释如何获得此输出吗?
我一直在研究创建类似于Markdown的标记语言。我想知道从哪里开始这样的事情。我已经对创建语言进行了一些研究,最终得到了有关词法分析器和AST的教程-最终,这些语言被传递给了LLVM之类的东西。
据我了解,像C这样的语言是命令性语言,而像Markdown这样的语言是声明性语言。对于可能不会触及LLVM之类的东西的工具链,它到底是什么样的?
我看到了其他答案,例如如何在Python中标记语言。但是,我该如何在C语言中执行此操作?我想拥有可以在任何地方使用的东西(例如集成到Ruby本机扩展或C#项目中)。
我似乎找不到适合的方向。是否有人从哪里开始有经验/提示?我将在何时何地构建“二进制文件”(从源代码创建HTML?)
Markdown甚至使用词法分析器吗?从语法上看,仅使用正则表达式就可以了。
抱歉,如果范围太广,但我找不到关于该主题的太多信息(也许我只是在错误的地方搜索!)
为了使我的问题易于理解,我想使用以下示例:
以下代码在fortran语言中称为非块do-loop
DO 20 I=1, N      ! line 1
DO 20 J=1, N      ! line 2
    ! more codes
20  CONTINUE      ! line 4
Run Code Online (Sandbox Code Playgroud)
要注意的是,标签204个装置的末端都内做环和外DO循环。
我希望我的 flex 程序正确解析该功能:当 flex 读取 label 时20,它将返回ENDDO终端两次。
首先,因为我也用bison,所以每次bison 打电话yylex()都拿到一个终端。如果我可以yylex()在某些情况下要求 bison 获取终端,在其他情况下从另一个函数获取终端,也许我可以解决这个问题,但是,我当时不知道。
当然有一些解决方法,例如,我可以使用 flex 的启动条件,但我认为这不是一个好的解决方案。所以我问是否有任何方法可以在没有解决方法的情况下解决我的问题?
作为我正在参加的“编译器理论”课程的一项作业,我必须用lex / yacc编码计算器。一些要求是:
如果我尝试输入以下内容:
a=5;
a; // Output: 5
a==5; // Syntax error
Run Code Online (Sandbox Code Playgroud)
但是,如果我输入以下内容,它将起作用:
5==a; // Output: 1
Run Code Online (Sandbox Code Playgroud)
我认为问题在于yacc正在读取a==5的是表格的新赋值,<a> <=> <=5>而不是<a> <==> <5>。我仍然不知道如何解决该问题。我尝试使用%prec注释,但这不能解决问题。
这是代码:calc.l
%{
#include "y.tab.h"
void yyerror(char* s);
%}
%%
"exit"      { return exit_command; }
[0-9]+      { yylval.num = atoi(yytext); return number; }
[a-zA-Z]    { yylval.id = yytext[0]; return identifier; }
[ \t\n]     ;
[-+*/()^%;] { return yytext[0]; }
[<>=!&|]    { return yytext[0]; }
.       { ECHO; yyerror("Unexpected character"); } …Run Code Online (Sandbox Code Playgroud) 我想做解析器,它将把表达式输出到它们的计算步骤中。而且,当我编译代码时,我无法解决这些问题。我总是会出错
code.l:13:1: error: expected expression before '=' token
  yylval.name = strdup(yytext);
 ^
code.l:18:1: error: expected expression before '=' token
  yylval.name = strdup(yytext);
 ^
Run Code Online (Sandbox Code Playgroud)
我尝试了很多不同的事情,我认为这是一个问题,但是没有成功。
代码
code.l:13:1: error: expected expression before '=' token
  yylval.name = strdup(yytext);
 ^
code.l:18:1: error: expected expression before '=' token
  yylval.name = strdup(yytext);
 ^
Run Code Online (Sandbox Code Playgroud)
代码
%{
#include <stdio.h>
#include <string.h>
#include "Assignment.tab.h"
%}
%%
" " ;
"\t" ;
[a-zA-Z]+
        {
        yylval.name = strdup(yytext);
        return(ID);
        }
[0-9]+
        {
        yylval.name = strdup(yytext);
        return(NUM);
        }
[-+=()*/\n]
        {
        return yytext[0]; …Run Code Online (Sandbox Code Playgroud)