Tag: flex lexer

来自词法分析器和语法的简单计算器的意外行为

我开始了整个Flex和Bison的世界。 所以我按照教程为flex编写了这个l文件: %{ #include #include void yyerror(char *); #include “y.tab.h” %} %% /******************** RULES ********************/ /* One letter variables */ [az] { yylval = *yytext – ‘a’; // This is to return a number between 0 and 26 representting the letter variable. printf(“VAR: %s\n”,yytext); return VARIABLE; } /* Integer constants */ [0-9]+ { yylval = […]

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); […]

Flex不在多行注释上正确计算行数

我使用上面的正则表达式来识别Flex中的多行注释: [/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { /* DO NOTHING */ } 但在我看来,flex / bison没有正确返回线路计数器。 例如: 输入: 1 ___bqmu7ftc 2 // _qXnFEgQL9Zsyn8Ohtx7zhToLK68xbu3XRrOvRi 3 /* “{ output 6 = <=W if u7 do nN)T!=$||JN,a9vR)7" 4 -758939 5 -31943.6165480 6 // "RND" 7 '_' 8 */ 9 [br _int] 输出: 1 TK_IDENT [___bqmu7ftc] 4 [ 4 TK_IDENT [br] 4 TK_IDENT [_int] […]

用C模拟野牛的布尔

我正在尝试使用C和Bison制作逻辑计算器,但我遇到了麻烦,因为C没有布尔类型。 这是我的Flex规则的一部分: “TRUE” | “T” | “t” {yylval = 1; return TRUE; } “FALSE” | “F” | “f” {yylval = 0; return TRUE; } 这是我的Bison规则的一部分: line: EOL | exp EOL {printf(“%d %d %d \n”), $1, $2,$$;} ; exp: TRUE | FALSE ; 这是我在计算器中输入T后跟EOL(行尾)时的输出: 10 12 1 10是asline为换行符,12为ascii用于回车,1为Ascii用于启动我有相同的输出为F. 如果我输入一个T,如果我输入F,那么1是1美元,1美元是1美元?

Flex具有启动条件可重入

我正在尝试制作一个依赖于启动条件的可重入扫描器。 我正在跟随类似这个家伙的问题: 用Flex编写重入词法分析器 正如一张海报所提到的,如果您明确创建yyscan_t并将其作为额外参数传递,则扫描程序将起作用。 但是,当使用BEGIN 等操作启动条件时,我仍然会收到yyg undeclared错误消息。 这是一个错误吗? 我应该明确使用yy_push_state和yy_pop_state状态函数吗?

使用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 并修复。

strndup有什么问题?

我正在使用flex编写解析器。 我使用的是Mac OS X 10.6.7。 我已经包含了这样的头文件: #include “string.h” #include “stdlib.h” 但它说 Undefined symbols for architecture x86_64: “_strndup”, referenced from: _yylex in ccl2332A.o ld: symbol(s) not found for architecture x86_64 为什么?

从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? 谢谢

IPv6地址的正则表达式

我有一个IPv6地址的正则表达式,如下所示 IPV4ADDRESS [ \t]*(([[:digit:]]{1,3}”.”){3}([[:digit:]]{1,3}))[ \t]* x4 ([[:xdigit:]]{1,4}) xseq ({x4}(:{x4}){0,7}) xpart ({xseq}|({xseq}::({xseq}?))|::{xseq}) IPV6ADDRESS [ \t]*({xpart}(“:”{IPV4ADDRESS})?)[ \t]* 它是正确的所有格式的IPv6地址,包括 1) non-compressed IPv6 addresses 2) compressed IPv6 addresses 3) IPv6 addresses in legacy formats.(supporting IPv4) 传统格式的IPv6地址的理想示例是 2001:1234::3210:5.6.7.8 OR 2001:1234:1234:5432:4578:5678:5.6.7.8 As you can see above there are 10 groups separated by either `”:” or “.”.` 与普通IPv6地址中的8组相反。这是因为最后4组由“”组成。 应该压缩成IPv6地址的最低32位。因此我们需要10组来满足128位。 但是,如果我使用以下地址格式 2001:1234:4563:3210:5.6.7.8 这里用“:”分隔的每个组代表16位。最后四个组用“。”分隔。 […]