bison 相关问题

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

FLEX/BISON 在不同文件夹中生成 location.hh、position.hh、stack.hh

我有这样的文件夹结构 包括/ 源代码/ |解析器.yy |扫描仪.ll 并在 src/CMakeLists.txt 中: SET(BisonOutput ${CMAKE_SOURCE_DIR}/src/_parser.cpp) 如果(BISON_FOUND) ADD_CUSTOM_COM...

回答 2 投票 0

Flex 和 Bison:Xubuntu 上的编译错误

我正在使用 Xubuntu 并尝试与 Flex 和 Bison 一起创建一个简单的解析器。这是我正在遵循的过程: 创建了一个 .lex 文件和一个 .y 文件。 运行以下命令来生成 C

回答 1 投票 0

如何编写 bison 文件来自动使用 C 头文件中定义的令牌枚举列表?

我正在尝试使用 Bison/Yacc 构建一个解析器,以便能够解析另一个模块完成的令牌流。令牌已在枚举类型中列出,如下所示: // C++ 头文件 枚举托克...

回答 2 投票 0

如何使用 flex/bison 的“内置”yyerror() 函数?

我创建了自己的。效果很好。但是,我想使用 flex/bison 提供的默认 yyerror() 函数。我在 Windows 11 上使用 GNU C。

回答 1 投票 0

Flex 和 Bison 不接受输入文件

我正在为一个班级编写Flex&Bison程序,我觉得我快完成了。 但是,当我尝试使用输入文件运行程序时,它只是拒绝读取它并让我输入行

回答 1 投票 0

Bison %prec 运算符优先级和一元减号问题

我正在用 flex 和 bison 实现一个简单的计算器。 我希望以下输入给出 -4 而不是 4: -2^2 为了达到-4,我必须声明 ^ 运算符的优先级高于...

回答 1 投票 0

将生成的文件添加到发行版的最佳方法?

我有一个使用 autoconf / automake 的相当复杂的(C++)项目,其中包括一些“生成的”文件(foo.yy -> foo.cc)。实际构建是使用“控制脚本”完成的(Gen...

回答 1 投票 0

在 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

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