似乎GCC和LLVM-Clang使用手写递归下降解析器,而不是机器生成,基于Bison-Flex,自下而上解析.
请问有人请确认是这种情况吗?如果是这样,为什么主流编译器框架使用手写解析器?
更新:这里有关此主题的有趣博客
我想学习如何写一个词法分析器.我的大学课程有一个任务,我们必须编写一个解析器(和一个词法分析器一起使用),但这是给我们的,没有任何指示或反馈(超出标记),所以我并没有真正从中学到很多东西.
在搜索了这个主题之后,我只能找到相当高级的写作,这些写作集中在我觉得比我所处的位置提前几步的区域.我想讨论为一种非常简单的语言编写词法分析器的基础知识,我可以将其作为研究更复杂语言标记的基础.
在这个阶段,我并不是对最佳实践或优化技术感兴趣,而是更喜欢专注于基本要素.有什么好的资源让我入门?
我正在寻找可以进行研究的解析器和/或解析器生成器的源代码,以便进一步发展,我在学校课程中获得的技能.你知道任何类型的推荐解析器吗?
给定一个算术表达式,我需要一些创建自定义树的帮助.比如说,您输入此算术表达式:
(5+2)*7
Run Code Online (Sandbox Code Playgroud)
结果树应如下所示:
*
/ \
+ 7
/ \
5 2
Run Code Online (Sandbox Code Playgroud)
我有一些自定义类来表示不同类型的节点,即PlusOp,LeafInt等.我不需要评估表达式,只需创建树,所以我可以在以后执行其他功能.此外,否定运算符' - '只能有一个子节点,并且要表示'5-2',您必须将其输入为5 +( - 2).
需要对表达式进行一些验证,以确保每种类型的运算符都具有正确的no.参数/儿童,每个开口括号都附有一个结束括号.
另外,我应该提一下,我的朋友已经编写了将输入字符串转换为一堆标记的代码,如果这对此有帮助的话.
我会感激任何帮助.谢谢 :)
(我读过你可以编写一个语法并使用antlr/JavaCC等来创建解析树,但我不熟悉这些工具或编写语法,所以如果这是你的解决方案,我将不胜感激,如果你可以为他们提供一些有用的教程/链接.)
我想从一个令牌列表中构造一个AST.我正在编写脚本语言,我已经完成了词法分析部分,但我不知道如何创建AST.所以问题是,我该怎么做这样的事情:
WORD, int
WORD, x
SYMBOL, =
NUMBER, 5
SYMBOL, ;
Run Code Online (Sandbox Code Playgroud)
并将其转换为抽象语法树?最好,我想在没有像ANTLR之类的库那样的情况下这样做,我宁愿自己尝试从头开始.但是,如果这是一项非常复杂的任务,我不介意使用库:)谢谢
我见过几种基于Javascript构建的语言(即CoffeeScript和LessCSS).
有没有教程可以用Javascript编写语言/解析器?
我想解析一个布尔表达式(在C++中).输入表格:
a and b xor (c and d or a and b);
Run Code Online (Sandbox Code Playgroud)
我只想将这个表达式解析为树,知道优先级规则(不是,和,xor,或).所以上面的表达式应该类似于:
(a and b) xor ((c and d) or (a and b));
Run Code Online (Sandbox Code Playgroud)
到解析器.
树将是以下形式:
a
and
b
or
c
and
d
xor
a
and
b
Run Code Online (Sandbox Code Playgroud)
输入将通过命令行或以字符串的形式.我只需要解析器.
有没有可以帮助我做到这一点的消息来源?
在PHP中是否有Lex和Yacc的实现?
如果没有,任何人都可以建议一个词法分析器和解析器生成器(即Lex和Yacc之类的东西)来创建PHP代码.我不太担心生成的解析器的性能.
我厌倦了使用正则表达式解析真正不应该用正则表达式解析的东西......
我需要在PHP中将正则表达式解析为它们的组件.我创建正则表达式或执行它们没有问题,但我想显示有关正则表达式的信息(例如列出捕获组,将重复字符附加到它们的目标,......).整个项目是WordPress的一个插件,它提供了有关重写规则的信息,这些规则是具有替换模式的正则表达式,并且可能很难理解.
我自己写了一个简单的实现,它似乎处理我抛出的简单正则表达式并将它们转换为语法树.在我扩展这个例子以支持更多op的正则表达式语法之前,我想知道是否还有其他好的实现我可以看一下.实现语言并不重要.我假设大多数解析器都是为了优化匹配速度而编写的,但这对我来说并不重要,甚至可能会妨碍清晰度.
将使用哪种算法来实现此目的(例如,这是一个字符串,我想找到答案):
((5 + (3 + (7 * 2))) - (8 * 9)) / 72
Run Code Online (Sandbox Code Playgroud)
如果有人写到,我怎么能处理这么多嵌套的括号?
parsing ×7
c++ ×2
java ×2
php ×2
algorithm ×1
boost-spirit ×1
c ×1
compilation ×1
interpreter ×1
javascript ×1
lex ×1
lexer ×1
regex ×1
tree ×1
yacc ×1