- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 bison/flex 程序中,在调用 yyparse() 之后,会打印一个前导制表符,但我不知道为什么。你能看出哪里出了问题吗?
这会调用 bison 代码,并在 yyparse() 返回后立即打印一个选项卡。
void parseArguments(int argc, char** argv)
130 {
131 int i;
132
133 int sum = 0;
134 // calculate the length of buffer we need
135 for(i = 1; i < argc; i++)
136 {
137 sum += strlen(argv[i]) + 1;
138 }
139
140 if(sum <= 0)
141 return;
142
143 // make us a buffer and zero it out
144 char tempBuffer[sum];
145 memset(tempBuffer, 0, sum);
146
147 // pointer to walk through our buffer
148 int pos = 0;
149
150 // copy arguments into the buffer
151 for(i = 1; i < argc; i++)
152 {
153 memcpy(tempBuffer+pos, argv[i], strlen(argv[i]));
154 pos += strlen(argv[i]);
155 sprintf(tempBuffer+pos++, " ");
156 }
157
158 // give our arguments to lex for parsing
159 configBuffer(tempBuffer);
160
// use bison parsing
163 int returnVal = yyparse(); // after this returns a tab character has been printed
164 if(returnVal != 0)
165 {
166 printf("yyparse failed!\n");
167 }
168
我所有的 bison 规则都是与 return 语句配对的正则表达式。我能看到影响这一点的唯一对 Bison 感兴趣的代码是:
64 %%
65 void configBuffer(char* arguments)
66 {
67 #ifdef DEBUG
68 printf("Given the buffer: %s\n", arguments);
69 #endif
70 yy_delete_buffer(YY_CURRENT_BUFFER);
71
72 yy_scan_string(arguments);
73 }
我尝试了几个人给出的建议,但还是不行。这是我的完整 flex 文件:
%{
#include <string.h>
#include "CommandParser.tab.h"
%}
%%
\t {
printf("TAB!\n");
}
" " {
printf("SPACE!\n");
}
\n {
return;
}
-p {
return PRINTMODE;
}
-x {
return XORMODE;
}
-n {
return NOTMODE;
}
-a {
return ANDMODE;
}
-o {
return ORMODE;
}
-r {
return RANGEFLAG;
}
-l {
return LENGTHFLAG;
}
0[xX][0-9a-fA-F]+ {
int retVal = sscanf(yytext, "%x",&(yylval.int_val));
if(retVal != 1)
return;
return NUMBER;
}
[0-9]+ {
yylval.int_val = atoi(yytext);
return NUMBER;
}
['"].*+['"] {
yylval.string_val = strdup(yytext);
return ARGUMENT;
}
[^ \t\n]+ {
yylval.string_val = strdup(yytext);
return ARGUMENT;
}
%%
void configBuffer(char* arguments)
{
#define DEBUG
#ifdef DEBUG
printf("Given the buffer: %s:\n", arguments);
#endif
yy_delete_buffer(YY_CURRENT_BUFFER);
yy_scan_string(arguments);
最佳答案
是否在您的词法分析器中未处理制表符,因此正在应用默认规则匹配和回显?
放一个额外的匹配
\t { printf("TAB"); }
进入结束代码部分之前的代码。
如果显示 TAB 而不是\t,则将 printf 变成一个空语句
\t { /*printf("TAB")*/; }
lex 发布后编辑:
好的,在测试了你的 lex 之后,你似乎正确地匹配了东西。
我用这段代码来测试它
#include <stdio.h>
#include "CommandParser.tab.h"
YYSTYPE yylval;
int main(int argc, char* argv[])
{
while(1)
{
printf("lex:%d\r\n",yylex());
}
return 0;
}
extern "C" int yywrap();
int yywrap ()
{
return 1;
}
所以输入(通过标准输入)
-a<\ >-x<\t>-p<space>-c<\r>
我明白了
lex:103
SPACE!
lex:101
TAB!
lex:100
SPACE!
lex:108
lex:3
对于这个头文件
#define PRINTMODE 100
#define XORMODE 101
#define NOTMODE 102
#define ANDMODE 103
#define ORMODE 104
#define LENGTHFLAG 105
#define RANGEFLAG 106
#define NUMBER 107
#define ARGUMENT 108
#define DEFUALT 0
typedef union {
int int_val;
char* string_val;
} YYSTYPE;
#ifdef __cplusplus
extern "C" int yylex();
extern "C" YYSTYPE yylval;
#else // __cplusplus
extern YYSTYPE yylval;
#endif // __cplusplus
接下来我要尝试的是用这段代码替换 yyparse
,看看会得到什么。
while(1)
{
printf("lex:%d\r\n",yylex());
}
如果你仍然打印出标签,那么它就是你的词法分析器,否则它就是你的解析器/主程序。
为了找出答案,我会用 const string
替换您创建的魔术字符串,然后看看在这种情况下会发生什么。基本上二进制搜索您的代码以找到问题点。
关于c++ - yyparse 正在打印前导标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1071804/
我使用同一个输入文件多次调用yyparse()。我必须从文件开头开始解析到某个点,然后跳转到同一文件中的其他位置(解析那里的一些行),然后返回到原始位置并从那里再次开始解析。这我已经做过很多次了。每次
我的 main.cpp 看起来像这样: #include #include #include #include "astgen.h" #include "astexec.h" extern in
在我的 bison/flex 程序中,在调用 yyparse() 之后,会打印一个前导制表符,但我不知道为什么。你能看出哪里出了问题吗? 这会调用 bison 代码,并在 yyparse() 返回后立
我正在为我正在处理的自定义微 Controller 编写汇编程序。我已经让汇编器达到了将指令汇编为二进制的程度。 但是,我现在在让标签正常工作时遇到问题。目前,当我的汇编程序遇到一个新标签时,它会存储
我正在实现一个逐行数据解析器,它通过在循环中调用 yyparse 来工作。唯一的问题是,除了全局变量之外,我无法提取数据,这是我希望避免的。有小费吗? 最佳答案 您可以使用 bison 的 %pars
我正在开发一种脚本语言和 C API,以便 C 程序可以与我的语言交互。它基于 LUA 的堆栈方法。但是,我在两个模块之间的同步方面遇到了一些问题...... 在 API 的 init 函数上,我启动
我的大学有一个项目,用C语言制作一个迷你shell。为了解析命令行,我使用以下工具:lex 和 yacc。但我想解析该行。当检测到 token 时,在我的 struct 命令中添加参数,当我找到换行符
friend 们,我正在解析一个 bibtex 文件,文件中有多个 bibtex 条目,例如 @Book{a1, Title="ASR", Publisher="oxf", A
我正在制作一个汇编程序。我正在使用 bison 和 flex 来这样做。我还有一个 C 文件,其中有我的主要功能。但是由于某种原因在调用 yyparse() 函数后程序崩溃了。 这是我的代码示例。但它
我正在使用 bison 和 flex 开发一个简单的解释器。当我编译我的代码时,我收到“未定义对‘yyparse’的引用”的错误。 mylang.ll %{ /********************
我试图在循环中解析输入,直到用户输入“退出”。但是,当我通过参数传递查询时,yyparse() 有效,但当我在循环中执行相同的过程时,它显示错误。 我已经检查了“cmd”,它显示了准确输入的用户查询。
难怪我无法从我的 flex 文件链接到它。我检查了这个并取出声明“YYSTYPE yylval;”从 yyparse 开始,它按预期工作。这肯定不是使用 bison 和 flex 的正确方法吗?有人可
这个问题类似于this one但对于 yyparse,而不是 yylex。 我已经为此奋斗了几个小时了!我想从一个 C 程序(实际上是一个 C++ 程序,但我最终使用旧的 flex/bison 而不是
之前,我没有从 yacc 读取生成的代码小心。现在我看到了这样一段代码: #define yyparse ol_parser_parse 我知道yyparse的定义如下: int yyparse (v
我在我的 C 代码中包括了两个不同的词法解析器,因此要包括第二个在其上定义的前缀: %option prefix="prep" 当我将它集成到全局项目中时,它编译时没有错误,但在执行时,如果我尝试调用
我正在尝试实现 flex 和 bison,但此循环返回了核心转储的段错误第一个文件工作正常,但下一个文件崩溃并打印成终端段错误。 DIR *dir; struct dirent *ent; i
我想从 lex/yacc 生成两个独立的解析函数。通常 yacc 给你一个函数 yyparse() ,你可以在你需要做一些解析时调用它,但我需要有几个不同的 yyparses,每个都与不同的词法分析器
仍在学习 yacc 和 flex,并遇到了我的操作方法和教程未涵盖的场景。我正在尝试解析一个文件,并且在进行过程中,我正在对放置在 parser.y 文件中的代码进行一些辅助错误检查。当我遇到字典顺序
我正在尝试学习一些 flex/bison,我正在阅读 John Levine (O'Reilly) 的 Flex & Bison。有一个我需要运行的示例,但是由于出现以下错误,我无法运行它: /tmp
我正在使用 Windows 上的 Flex 和 Bison 为一种相对简单的语言创建编译器。但是编译器告诉我函数 yyerror 和 yyparse 没有在正确的范围内声明。经过一番阅读后,我发现问题
我是一名优秀的程序员,十分优秀!