bison 相关问题

Bison是GNU解析器生成器。它生成LALR解析器,但也可以为非LALR的语法生成GLR解析器。它具有与其旧前任Yacc(另一个编译器编译器)兼容的模式。

在 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

有没有办法影响同一个表达式的不同解析方式? (野牛)

所以,我目前正在为一个项目研究一种语言的语法,这就是事情。我希望它的行为有所不同,无论末尾是否有分号。例如表达式...

回答 1 投票 0

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

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

回答 1 投票 0

错误:与 Flex 词法分析器集成时,Bison 解析器中存在未知类型名称“ASTNode”

我正在开发一个项目,其中使用 Bison 生成解析器并使用 Flex 生成词法分析器。我的解析器旨在生成抽象语法树(AST),并且我已经定义了 ASTNode 结构

回答 1 投票 0

Bison,C++ GLR 解析:如何强制移位 减少冲突?

如何强制转变 减少冲突,通过GLR方法解决? 假设我希望解析器解决右移运算符和 temp 的两个右尖括号之间的冲突...

回答 3 投票 0

如何在Bison中结束if语句?

if_stmt:tok_if '('条件')' '{'根'}' {debugBison(26);} ; 条件:表达式 {debugBison(19); if ($1==0.0){退出(0);}} ; 我正在尝试在野牛中实现 if 条件,每个...

回答 1 投票 0

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

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

回答 1 投票 0

正则表达式匹配flex中的“True”或“False”

我需要创建正则表达式验证器,它需要匹配 Flex 中的文本“True”或“False”。 我尝试过以下正则表达式: (对|错|对|错) 和 ([Tt][呃...

回答 1 投票 0

Bison 平衡括号语法

使用当前的解析器,我能够做到这两点: 让 (x, y, z) = (10, true, 5); 让 (x) = (10); 但我不能这样做: 让 (((x)), y, z) = (10, true, 5); 这是我的语法: 标识符列表:标识符

回答 1 投票 0

如何避免在 bison 的块中执行

所以我面临一个问题,它执行 PRINT 命令,尽管返回值是 false 例如: 函数主(){ a -> 9; 打印(一); 如果(a > 10){ 打印(99); } } 所以 99

回答 1 投票 0

如何消除bison语法中的shift/reduce冲突?

我正在尝试为 HTTP 编写一个解析器,并且在标头字段末尾包含可选空格时遇到了移位/归约冲突。有谁有关于如何绕过...

回答 1 投票 0

flex 和 bison 对我的输入表现出意想不到的行为

我试图用flex和bison编写一个逻辑表达式评估工具。我已经检查了代码很多次,但是当我运行可执行文件时,它只是忽略我的输入并在

回答 1 投票 0

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

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

回答 1 投票 0

变量计算器 Bison 和 flex

我如何编写 LEX 和 Bison 程序来识别使用运算符 +、-、* 和 / 的有效算术表达式,它优先考虑括号 () 并接受变量和 t 的定义...

回答 1 投票 0

Bison 解析不会正确终止,尽管所有解析都正确完成(意外的 x,期望 $end)

我收到此错误:错误:语法错误,意外(某事),期望 $end,其中(某事)代表文件中的最后一个标记。我的语法很大,所以我无法在这里展示,但这里有一些

回答 1 投票 0

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

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

回答 1 投票 0

‘yylex’未在此范围内声明,该怎么办?

我尝试在 flex 和 bison C 文件中编译 g++ 文件,但出现错误:“yylex”未在此范围内声明。与“yyerror”情况相同。 我尝试将这样的行放入词法分析器中,...

回答 2 投票 0

如何为低内存系统设置flex和bison?

我喜欢在flex和bison的帮助下构建一个简单的协议解析器。它解析“reset”、“led on”、“set uart 115200,N,8”等命令。 解析器应该在 stm32f4 MCU 上运行(48Mhz,256KBytes RAM...

回答 2 投票 0

需要帮助使用 lex 和 yacc 生成三个地址代码

我正在为包含声明、算术、布尔、if 和 while 语句的 C 类程序生成三个地址代码。 目前我从算术表达式开始。我正在读 c ...

回答 3 投票 0

未定义对`yylex'的引用

我正在尝试使用 flex 和 bison 解析一个输入文件,但在编译程序时遇到一个困难。我附上了我的 Flex 和 Bison 代码以及我收到的错误。 请帮忙...

回答 4 投票 0

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