lex 相关问题

Lex是一个生成词法分析器(“扫描仪”或“词法分析器”)的计算机程序。 Lex通常与yacc解析器生成器一起使用。有关Amazon Lex的问题,请使用标签amazon-lex。

在 Xcode 中将 lex 和 bison 与 swift 一起使用

我正在致力于将 Swift 与在 Xcode 16.1 项目中使用 lex 和 bison 生成的简单解析器集成。 下面是我当前的代码: 计算l %{ #include“calc.tab.h” #包括 我正在致力于将 Swift 与在 Xcode 16.1 项目中使用 lex 和 bison 生成的简单解析器集成。 下面是我当前的代码: calc.l %{ #include "calc.tab.h" #include <stdlib.h> %} %% [0-9]+ { yylval.num = atoi(yytext); return NUMBER; } [ \t\n]+ ; "+" return '+'; "-" return '-'; "*" return '*'; "/" return '/'; "(" return '('; ")" return ')'; . return yytext[0]; %% calc.y %{ #include <stdio.h> #include <stdlib.h> #include "calc.h" void yyerror(const char *s); int result; %} %union { int num; } /* Define tokens with types */ %token <num> NUMBER %left '+' '-' %left '*' '/' /* Use %type to declare the type of non-terminal symbols */ %type <num> expr %% expr: expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { $$ = $1 / $3; } | '(' expr ')' { $$ = $2; } | NUMBER { $$ = $1; } ; %% int main(void) { return yyparse(); } void yyerror(const char *s) { fprintf(stderr, "Error: %s\n", s); } calc.h #ifndef CALC_H #define CALC_H extern int yylex(void); extern int yyparse(void); void yyerror(const char *s); int parseExpression(void); #endif calc.c #include "calc.h" #include <stdio.h> int result; int parseExpression(void) { if (yyparse() == 0) { return result; } else { return -1; // Error } } void yyerror(const char *s) { fprintf(stderr, "Error: %s\n", s); } 桥接标头.h #import "calc.h" 这是一个调用解析器的简单 SwiftUI 视图: struct ContentView: View { @State var result: Int32 = 0 var body: some View { VStack { Text("\(result)") Button("Calculate") { let expression = "3 + 5 * (10 - 4)" result = evaluate(expression: expression) print("Result: \(result)") } } .padding() } func evaluate(expression: String) -> Int32 { expression.withCString { cString in freopen("/dev/stdin", "r", stdin) fputs(cString, stdin) } return parseExpression() } } 我从终端手动运行这些命令: flex -o lex.yy.c calc.l bison -d calc.y -o calc.tab.c 当我在Xcode中编译项目时,遇到以下错误,但我无法解决: Undefined symbols for architecture arm64: "_yywrap", referenced from: _yylex in lex.yy.o ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 有人可以提供一些指导或指出我正确的方向吗? 我的问题不是重复现有问题,只是添加选项: %option noyywrap 按照建议并没有解决问题。事实上,由于重复的变量和函数定义,它引入了多个错误。 这是因为在 Xcode 项目中同时包含 .l (Flex) 和 .y (Bison) 文件会在幕后自动触发 Flex 和 Bison。 解决方案是更新分词器和解析器定义以避免引用不可用的 calc.tab.h。 以下是最终的工作文件: calc.l %option noyywrap %{ #include <stdio.h> #include <stdlib.h> enum { NUMBER = 258, PLUS, MINUS, MULTIPLY, DIVIDE, LEFTPAR, RIGHTPAR }; union YYSTYPE { int num; }; extern union YYSTYPE yylval; extern int expression_value; extern void yyerror(const char *s); %} %% [0-9]+ { yylval.num = atoi(yytext); return NUMBER; } [ \t\n]+ ; "+" return PLUS; "-" return MINUS; "*" return MULTIPLY; "/" return DIVIDE; "(" return LEFTPAR; ")" return RIGHTPAR; . return yytext[0]; %% calc.y %{ #include <stdio.h> #include <stdlib.h> void yyerror(const char *s); int yylex(void); int expression_value; %} %union { int num; } %token <num> NUMBER %token PLUS %token MINUS %token MULTIPLY %token DIVIDE %token LEFTPAR %token RIGHTPAR %left PLUS MINUS %left MULTIPLY DIVIDE %type <num> expr %% input: | expr { expression_value = $1; } ; expr: expr PLUS expr { $$ = $1 + $3; } | expr MINUS expr { $$ = $1 - $3; } | expr MULTIPLY expr { $$ = $1 * $3; } | expr DIVIDE expr { $$ = $1 / $3; } | LEFTPAR expr RIGHTPAR { $$ = $2; } | NUMBER { $$ = $1; } ; %% void yyerror(const char *s) { fprintf(stderr, "Error: %s\n", s); } calc.h #ifndef CALC_H #define CALC_H int evaluate_expression(const char *expression, int *result); #endif calc.c #include "calc.h" #include <stdio.h> extern int yyparse(void); extern void yy_scan_string(const char *str); extern void yylex_destroy(void); extern int expression_value; int evaluate_expression(const char *expression, int *result) { yy_scan_string(expression); // Parse and evaluate the expression int status = yyparse(); yylex_destroy(); if (status == 0) { *result = expression_value; } return status; } 这是调用解析器的 Swift(UI) 代码: struct ContentView: View { @State var expression: String = "" @State var result: Int32? var body: some View { VStack { TextEditor(text: $expression) if let result { Text("\(result)") } Button("Calculate") { result = evaluate(expression: expression) } } .padding() } func evaluate(expression: String) -> Int32? { var result: Int32 = 0 let status = expression.withCString { cString in evaluate_expression(UnsafeMutablePointer(mutating: cString), &result) } if status != 0 { // The parse returned an error return nil } return result } } 请注意,调用evaluate_expression函数需要Swift-Bridging.h文件。

回答 1 投票 0

lex 和 yacc 中的交互式输入 EOF(文件结束)等待问题

以下是我的两个文件: 计算l %{ #include“y.tab.h” %} %% [0-9]+ { yylval = atoi(yytext);返回号码; } [ ]; “+”{返回“+”; } “*“ { 返回 '*'; }...

回答 1 投票 0

Bison 解析器处理 for 循环的问题(语法错误)

我正在使用上下文无关语法和 Bison 和 Flex 编写一个解析器来处理包含 for 循环的简单语言。但是,当我尝试解析有效的 for 循环时遇到语法错误

回答 1 投票 0

优先问题 - 使用 LEX 编写正则表达式来匹配特定模式的字符串

我尝试编写常规定义来显示以下字符串行 使用 LEX。 a.匹配任何以d开头、以t结尾的字符串 b.匹配字符串 def c.匹配一个或多个

c lex
回答 1 投票 0

解决由多个规则中定义的 SET 子句引起的 Cypher 解析器中的移位/归约冲突

我正在开发一个项目来支持 Postgres psql 中的 Cypher 子句。所有 PostgreSQL 和 Cypher 命令都将通过 Cypher 的解析器。有关更多详细信息,请参阅以下问答:如何

回答 1 投票 0

仅使用 Lex 和 Yacc 解析宏调用

我正在尝试构建一个解析器,它仅解析代码库中的 C++ 宏调用,并将参数存储在宏调用中以供进一步处理。在该代码库中,已知宏包含

回答 1 投票 0

在编程语言中标记省略号以避免浮点

我正在设计一种语言,我想使用 .. 来定义整数范围。问题是 0..10 被标记为浮点数 0. 和 .10。 我如何允许 Flex 支持这种语法?是吗

回答 3 投票 0

忽略 lex/flex 输入中的字符或:理解 YY_INPUT

我正在解析包含需要拼写检查的单词的文件。输入为 RTF 格式。 要检查的单词中有 \- 字符串,指定单词在该处的预定断点...

回答 1 投票 0

忽略 lex/flex 输入中的字符

我正在解析包含需要拼写检查的单词的文件。输入为 RTF 格式。 要检查的单词中有 \- 字符串,指定单词在该处的预定断点...

回答 1 投票 0

如何让 lex/flex 识别不以空格分隔的标记?

我正在学习编译器构建课程,我当前的任务是为我们正在实现的语言编写词法分析器。我不知道如何满足词法分析器的要求...

回答 2 投票 0

我正在使用 Flex 和 Bison 编写一个简单的计算器,但我不断遇到错误,例如缺少库、未解析的引用

%选项 noyywrap %{ #include“计算器.tab.h” int yyerror(const char *); %} %% [ ] [0-9]+ { yylval = atoi(yytext);返回号码; } “+”...

回答 1 投票 0

Python Lex Yacc:正则表达式错误

我正在尝试 PLY 进行句子验证。我采用一个简单的语法规则。 句子 -> 名词 动词 名词 -> r'[A-Za-z]' 动词 -> is|are|am|.. 当我将动词设置为 is|am 或 am 时,即我保留...

回答 1 投票 0

如何编写 Flex 代码来匹配协议(http、https)、域名和可选端口号以及 URL 的路径

如何编写 Flex 代码来匹配协议(http、https)、域名和可选端口号以及 URL 路径 示例输入: http://google.com https://google.com:6060 https://google.com:6060/

回答 1 投票 0

lex 不生成输出

只需按照 https://begriffs.com/posts/2021-11-28-practical-parsing.html 上的教程进行操作即可。我的 .l 文件如下所示: /* catcot.l */ %{ #包括 %} %% 婴儿床 { printf("便携式床&

回答 1 投票 0

在 Windows 上运行 bison 时出错“冲突:1 个移位/减少,1 个减少/减少 C:\GnuWin32 in ison.exe: m4: 无效参数”

第一次学习 lex yacc。 但 bison 中没有代码正在运行 错误:ison.exe 中的 C:\GnuWin32:m4:参数无效 我重新安装了野牛检查了路径,但错误仍然没有消失。 索梅特...

回答 1 投票 0

扫描仪中长注释的输入缓冲区溢出

我使用以下规则定义了 LEX 扫描器来扫描(嵌套)注释: “(*”{ int linenoStart,级别,ch; linenoStart = yylineno; 级别=1; 做 { ch =

回答 1 投票 0

如果`yywrap()`什么都不做会发生什么?

我读到必须编写 %noyywrap 或定义 yywrap() 函数。 如果我默认一个 yywrap() 函数,其中我不对 yyin 变量进行任何更改并返回 0,会发生什么情况

回答 1 投票 0

在 lex.yy.c 中查找表代表什么?

我正在挖掘一个用 flex 构建的词法分析器(这里是准确的),并试图了解发生了什么。从来没有看过 C,我已经放弃尝试找到等效的东西来理解 p...

回答 1 投票 0

Yacc:布尔和算术表达式语法冲突

我正在实现一个编译器作为类的一部分,用于一种应该支持算术和布尔表达式的语言。不幸的是,我在实施机器人规则时遇到了一些麻烦......

回答 1 投票 0

错误:请求非结构或联合中的成员“代码”

我有 lex 和 yacc 文件。 lex - tokens.l yacc - 表达式.y 我使用 flex 作为 lex,使用 bison 作为 yacc 表达式.y: %{ #包括 #包括 #包括 #在...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.