解析C++的问题是众所周知的.它不能纯粹基于语法进行解析,它不能像LALR那样完成(无论术语是什么,我不是语言理论家),语言规范是一个很多页面等等.由于这个和其他原因我为我的个人项目决定另一种语言.
Vala看起来很好.虽然提供了许多比C++更多的改进,但解析起来同样麻烦吗?或者它有一个整洁,合理的长度形式语法,或一些逻辑描述,适合构建编译器,源分析器和其他工具的解析器?
无论答案是什么,Genie替代语法都是如此?
(我也很想知道D和其他后C++非VM语言不太强烈.)
我正在开发一个C++解析器(用于IDE),所以现在尝试详细了解C++语法.虽然我在http://www.nongnu.org/hcb/找到了一个优秀的语法源,但我很难理解它的某些部分 - 特别是,哪些"真正的"语言结构对应于各种制作.
所以我正在寻找一个C/C++ BNF语法指南,其中包含与各种制作/规则相匹配的代码示例.有吗?
在阅读完这个问题之后,我想知道当主要的C++编译器解析这样的代码时会发生什么(关于AST):
struct foo
{
void method() { a<b>c; }
// a b c may be declared here
};
Run Code Online (Sandbox Code Playgroud)
他们像GLR解析器一样处理它还是以不同的方式处理它?还有哪些方法可以解析这个和类似的案例?
例如,我认为可以推迟解析方法体,直到整个结构被解析,但这是否真的可行且实用?
是否有可用的C语法生成AST,其中包括使用"^"和"!"的所有解析器规则.符号?
我阅读了Terence Parr写的这本书来编写这样的语法,但似乎为C语言编写一个这样的语法是一个耗时的过程,所以想知道它是否已经可用,这可以节省大量时间!
(对于较小的C语言子集的语法也很好..)
谢谢 :)
我正在阅读我的比较语言课的笔记,我有点困惑......
上下文无关文法和确定性上下文无关文法有什么区别?我正在专门阅读有关 CFG 的解析器是 O(n^3) 以及 DCFG 的编译器是 O(n) 的内容,并且并不真正理解时间复杂度的差异如何如此之大(更不用说我仍然对使 CFG 成为 DCFG 的特征感到困惑)。
非常感谢您!
big-o parsing programming-languages context-free-grammar context-free-language
我一直在搜索有关C++代码的符号表是否包含函数名称和类名的各种帖子.我可以在帖子上找到的东西是它取决于编译器的类型,
如果它在一次通过中编译代码,则它不需要在符号表中存储类名和子程序名
但如果它是一个多遍编译器,它可以添加有关它遇到的类及其子例程的信息,以便它可以进行参数类型检查并发出有意义的错误消息.
我无法理解它是否真的依赖于编译器?我假设编译器(对于C++代码)会在表中放置带有类名的函数名,无论它是单通道还是多通道编译器.它如何依赖传球?我没有这么棒的知识.此外,任何人都可以显示一个简单的C++类的示例符号表,它会是什么样的(带有类名的函数名)?
我试图理解如何重新创建由grako生成的解析器解析的文档.
在深入了解grako源代码后,我相信我终于明白了如何从AST返回到生成的文档.有人可以检查我的以下理解是否正确,如果有更直接的方法,请告诉我?
grako.model.Node语法中每个规则的单独类(子类).每个类必须至少有一个构造函数,其中包含相应规则中每个命名元素的参数,并将其值存储在类属性中.grako.codegen.ModelRenderer定义了"代码"生成模板,用于(或多或少)一个语法中的每个规则.grako.codegen.CodeGenerator().render(...)来创建输出.这可能是对的吗?这看起来根本不直观.
是否可以使用标准 C 语法(如官方 ANTLR4 GitHub 存储库中找到的语法)来实现经典的Yacc 词法分析器 hack,以区分 ANTLR4 生成的 C 解析器中的标识符名称和类型名称?
看来可以插入 ANTLR4 词法分析器的临时代码非常有限。在《The Definitive ANTLR4 Reference》一书中,Terrence Parr 说道:
“一种长期存在的常见做法涉及从解析器向词法分析器发送反馈,以便词法分析器可以向解析器发送精确的标记。[...]不幸的是,这对于 ANTLR 语法来说是不可能的,因为 ANTLR 生成的解析器通常在令牌流中向前看以做出解析决策。[...]”
有什么方法可以规避上述问题并实现反馈循环吗?或者在访问解析树时如果不采取疯狂的黑客手段,在 ANTLR4 中实现 C 解析器是不可能的吗?
我正在解析vba代码,其中......
此代码a在index处输出数组第一维的内容i:
Debug.Print a(i, 1)
Run Code Online (Sandbox Code Playgroud)此代码输出a给定参数的函数结果,i并且1:
Debug.Print a(i, 1)
Run Code Online (Sandbox Code Playgroud)此代码DoSomething在foo作为值进行求值时调用过程,并将值按值传递给过程(无论签名是否将其作为"by reference"参数):
DoSomething (foo)
Run Code Online (Sandbox Code Playgroud)此代码调用过程DoSomething而不foo作为值进行评估,如果签名采用参数"by reference",则通过引用传递它:
Call DoSomething(foo)
Run Code Online (Sandbox Code Playgroud)所以我有这个lExpression解析器规则是有问题的,因为第一个alternative(#indexExpr)匹配数组和过程调用:
lExpression :
lExpression whiteSpace? LPAREN whiteSpace? argumentList? whiteSpace? RPAREN # indexExpr
| lExpression mandatoryLineContinuation? DOT mandatoryLineContinuation? unrestrictedIdentifier # memberAccessExpr
| lExpression mandatoryLineContinuation? EXCLAMATIONPOINT mandatoryLineContinuation? unrestrictedIdentifier # dictionaryAccessExpr
| ME # instanceExpr
| identifier # simpleNameExpr
| DOT …Run Code Online (Sandbox Code Playgroud) 我进行了大量研究,以弄清楚如何从应用程序的源代码为应用程序创建 DFG。对于某些应用程序,例如 MP3 解码器、JPEG 压缩和 H.263 解码器,可以在线使用 DFG。
我无法弄清楚如何从源代码中为 HEVC 等应用程序创建 DFG?是否有任何工具可以为此类复杂的应用程序立即生成数据流图,还是必须手动完成?
请就此事给我建议。
编辑:我将 Doxygen 用于 HEVC,我可以看到不同的功能如何相互交互。然而,每个函数都有许多入口和出口点,一段时间后 Doxygen 的输出变得太混乱而无法理解。
我还看了 StreamIt:http ://camlunity.ru/swap/Library/Conflux/Stream%20Programming/streamit-cc_stream_graph_programming_language.pdf
它看起来很方便,但它为更简单的应用程序(如 MP3 解码器)生成的图表太复杂了。为了生成连贯的 DFG,我是否必须重新编写整个源代码?
algorithm parallel-processing open-source dataflow data-structures