问题标签 [lex]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
yacc - 野牛和 lex 字符串与 char
我正在尝试评估和表达形式
expr 可以是由某些字符组成的字符串,也可以是上面的函数。所以这可能看起来像
问题是,如果我以
如果我有类似的东西,我在构建语法时遇到问题
而且我不太确定语法是否错误或我的 AST 实现。
我发现我的逻辑有缺陷,因为在 nm expr 的情况下, expr expr 将返回 n*m 的值,它仍然是 nm。这会导致无限循环吗?我应该如何解析这样的表达式。
不要扔石头。野牛新手
后来的编辑 我设法清理并测试了 AST 和一些链表背后的代码。唯一的问题仍然是语法。
对于 Frac[m^2][m^4] node / node K m^4 node K m^4 这样的 expr,此语法失败
bison - 使用 Bison 时看到垃圾
我正在尝试使用Bison进行编译(我不知道这是否是正确使用的词),但是当我尝试编译此源代码时:
我在控制台中得到了一些“垃圾”(不是在文件或类似的东西中),看看: http: //pastie.org/650893
此致。
c - Flex 和 Bison 的词汇搭配
我一直在寻找一种不符合一般 Flex/Bison 范式的语言。根据语义上下文,它具有完全不同的令牌规则。例如:
Bison 显然支持对这些类型的语法的识别,但它需要“ Lexical Tie Ins ”来有效地支持它们。它为此提供了一个接口——但我对如何根据上下文提供不同的弹性正则表达式感到困惑——如果这是可能的话。
提前致谢 :)
c++ - 简单的 Flex/Bison C++
我已经在寻找答案,但是对于一个简单的示例,我没有得到任何快速响应。
我想使用 g++ 编译一个 flex/bison 扫描器+解析器,只是因为我想使用 C++ 类来创建 AST 和类似的东西。
在互联网上搜索我发现了一些漏洞,都说唯一需要的是在 lex 文件中使用 extern "C" 声明一些函数原型。
所以我的 shady.y 文件是
而 shady.l 文件是
最后在makefile中我使用g++而不是gcc:
flex 和 bison 工作正常,但在链接时出现以下错误:
当然,如果我尝试更改野牛文件中有关函数的任何内容,它会说 yylex 未在 yyparse 的范围内声明。
我是否试图简单地解决比看起来更复杂的问题?实际上,我不需要一个封闭的结构来以面向对象的方式访问解析器和词法分析器,我只是想让它工作。
我只想能够在野牛文件中使用 C++(创建 AST)并从 C++ 对象调用 yyparse() ..
提前致谢
macros - 在 yacc/bison lex 中处理 #define 宏
我将如何#define
使用 yacc/bison 实现宏?
我在想所有定义的字符都必须匹配一个常规变量。变量被定义为[a-zA-Z_][a-zA-Z0-9_]*
所以我想我可以在那里检查变量是否已定义有效。然后将文本替换为应有的内容。
我怎样才能做到这一点?现在我想完全忽略 BAD 这个词,就好像我#define BAD
在 C 中定义它一样。下面是该 lex 规则的代码,但我做错了。lex 还抱怨“BA”在流中。我知道下面是完全错误和不合逻辑的,所以我如何忽略 BAD,然后如何用 float 之类的东西替换它
我知道主要步骤是 1)定义定义,2)在源代码中检测它 3)让 lex 忘记宏字符 4)插入新的正确字符。
warnings - Bison 构建警告:“给出了 -s 选项,但可以匹配默认规则”
我收到警告
如果你用谷歌搜索“选项给定但默认规则可以匹配”,你会 在诊断部分的旧 Flex 手册页中找到Flex 手册中关于诊断的章节和此条目:
警告,'-s option given but default rule can be match' 意味着默认规则(匹配任何单个字符)有可能(可能仅在特定的开始条件下)是唯一匹配特定输入的规则。既然
-s
给出了,大概这不是故意的。
我的构建文件没有-s
选项。我写
如何解决此警告?
这是我的 lex 文件的一个小版本。此文件还会触发警告
yacc - 多个 flex/bison 解析器
在一个项目中处理多个 Flex/Bison 解析器的最佳方式是什么?
我写了一个解析器,现在我在同一个项目中需要第二个。到目前为止,parser1.y
我在第三部分中插入了main(..)
方法并yyparse
从那里调用。
我想要获得的是拥有两个不同的解析器(parser1.y
和parser2.y
)并能够从外部函数中使用它们(假设main
在main.cpp
)。
我应该使用哪些预防措施将yyparse
函数导出到.y
文件之外,我应该如何处理两个解析器?
PS。我正在使用 g++ 编译但不是 Flex 和 Bison 的 C++ 版本,我想保持这种方式(因此避免将解析器封装在对象中)。
parsing - Bison 中的 %union 指令
我试图在野牛解析器中使用抽象语法树,所以我尝试使用%union
指令。语法文件如下所示:
在当前状态下,我试图只使用结构,所以在文件中ast.h
我有以下声明:
我使用的是 g++ 而不是 gcc,它应该可以工作(我在网上找到了类似的示例),但ast_node
在定义时似乎不知道,YYSTYPE
因为我收到了这个错误:
/shady_parser/shady.y:22:错误:ISO C++ 禁止声明没有类型的“ast_node”。/shady_parser/shady.y:22:错误:预期的“;” 在'*'标记之前./shady_parser/shady.l:在函数'int cyylex()'中:./shady_parser/shady.l:35:错误:'union YYSTYPE'没有名为'node'的成员。/shady_parser/shady .l:37: 错误:'union YYSTYPE' 没有名为'node' 的成员 ./shady_parser/shady.l:38: 错误:'union YYSTYPE' 没有名为'node' 的成员
为什么会发生这种情况?
那么是否可以将 ast_node 定义为一个类并使用指向它的指针而不是指向结构的指针?
在此先感谢,杰克
c - 使用 GCC 和 Flex/Bison 发出无效警告的声明
使用 gcc 和 -Wall 选项编译我的项目时,我收到一条警告,提示我的 flex 文件最后一行不存在的语句无效:
警告:
外壳命令:
lex 文件的最后一部分:
任何人都知道为什么我可能会收到此警告?
如果我禁止所有 #line 指令,则错误是:
其中指的是 ECHO 行:
c - flex/lex yacc/bison 多线程环境
我可以在多线程环境中使用 flex/bison|lex/yacc 生成的代码吗?恐怕有很多全局变量。如何解决?