草庐IT

Java - 抽象语法树

我目前正在寻找一个Java6/7解析器,它生成一些(可能是标准化的)形式的抽象语法树。我已经发现ANTLR有一个Java6语法,但它似乎只生成解析树,而不是语法树。我还阅读了有关JavaCompilerAPI的内容——但提到的所有来源都认为它设计过度且文档不足(而且我还没有发现它是否真的生成了AST)。你知道有什么好的解析器库,输出尽可能标准化吗?谢谢 最佳答案 基本上JavaCC和ANTLR是目前最好的工具。您可以在project'sgrammarrepository中找到可用的Java6语法.JavaCC有点老派,很少更新,但很

c++ - 如何在 rascal MPL 中使用 SDF 的 {avoid}

我正在尝试使用RascalMPL设计一个孤岛语法,但我遇到了一个问题:在SDF中实现IslandGrammar时,一种非常常见的方法是使用{avoid}属性定义“包罗万象”的产水量。这会阻止解析器在其他适用的情况下使用此产生式。这允许指定一个可以被其他产品覆盖而不会产生歧义的默认行为。一个非常简单的例子是:contextfreesyntaxChunk*->InputWater->Chunklexicalsyntax~[\t\n\]+->Water{avoid}//avoidtheWaterproduction我尝试使用RascalMPL重现此行为。我的目标是创建一个孤岛语法,将所有条件

c++ - 使用 BOOST_FUSION_ADAPT_ADT 调整类时出错

我有以下类(class):#ifndefWFRACTAL_FRACTAL_METADATA_H_#defineWFRACTAL_FRACTAL_METADATA_H_#includenamespaceWFractal{namespaceFractal{classMetadata{public:voidsetAuthorName(conststd::string&name);voidsetAuthorEMail(conststd::string&email);voidsetBriefDescription(conststd::string&brief);voidsetCompleteDe

c++ - boost::未排序模式的精神语法

我有一个模型的模式部分需要解析。假设它看起来像下面这样。{type="Standard";hostname="x.y.z";port="123";}属性是:元素可能显示为无序。所有属于架构一部分的元素都必须出现,不能有其他元素。所有元素的综合属性都放入一个结构中。(可选)模式在未来可能取决于类型字段——即,基于类型的不同字段——但我目前并不关心这一点。 最佳答案 根据Sprite论坛,答案如下。Youmightwanttohavealookatthepermutationparser:a^b^cWhichmatchesaorborc

c++ - Bison :轮类减少冲突

我相信我无法理解轮类减少冲突的工作原理。我知道Bison可以向前看,所以我不明白为什么我会遇到这个问题。在我的语言中,列表被定义为[]之间的一组数字或列表。例如[][1][12][1[2]3]都是有效列表。这是导致问题的定义value:num|stringValue|list;list:LEFTBRACERIGHTBRACE|LEFTBRACElistRIGHTBRACE|numlist|RIGHTBRACE;冲突是从数开始的,不知道是按列表规则移位,还是按值规则归约。我很困惑,因为它不能检查列表是否跟在数字后面吗?任何关于我应该如何进行的建议都将不胜感激。

c++ - 是否有 boost::phoenix::at_c 结合 boost::spirit::qi::grammar 的替代方案

我已经创建了一个测试应用程序来说明我的问题。它解析以“a=”或“b=”开头并以“\r\n”分隔的整数列表。该列表包含以任何顺序多次出现的这些字段。#include#include#include#include#include#includetypedefstd::vectoruint_vector_t;std::ostream&operatorstructMyParser:publicboost::spirit::qi::grammar{MyParser():MyParser::base_type(Parser,"Parser"){usingboost::spirit::qi::ui

c++ - 在 C++ 中使用模板是什么意思

最近,我在别人的源代码中遇到了一些东西。我不太了解C++中的模板。你能帮我吗?structmy_grammar:publicgrammar{...};为什么my_grammar可以像它一样用作类型参数?最好的问候, 最佳答案 这是一个叫做奇怪的重复模板模式的成语-参见http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern.总之,它提供派生类作为基类的策略,其风格类似于Alexandrescu的《现代C++设计》一书中使用的策略(强烈推荐)。这样,基类可以使用

c++ - C/C++ 中的 typedef 是否真的通过组合复合类型(例如 int*)来创建新类型?

最近我发现我代码中的typedef与我建议的完全不同。像这样的例子:typedefint*ptype;ptypev1=0,v2=0;结果:v1和v2都被定义为指向int类型的指针。但是,如果您只是将第二句中的ptype替换为int*为int*v1=0,v2=0;或int*v1=0,v2=0;,只有v1是指针,v2是普通的int。typedef似乎没有做简单的替换。更重要的是,当涉及到像这样的复杂修饰符时:typedefint*ptype;constptypev3=0;结果将是:如果我们写constint*v3=0;。在上面的代码中,const代表整个ptype的修饰符,而不是ptype

c++ - [[除了属性外还有什么 'alternate grammar'?

我不明白这个:(7.6.1)Twoconsecutiveleftsquarebrackettokensshallappearonlywhenintroducinganattribute-specifier.[Note:Iftwoconsecutiveleftsquarebracketsappearwhereanattribute-specifierisnotallowed,theprogramisillformedevenifthebracketsmatchanalternativegrammarproduction.—endnote][Example:(slightlymodifiedf

c++ - 如何编写由函数模板化的原型(prototype)转换?

我想通过编写一个由函数指针模板化的原型(prototype)转换来重用代码:templatestructapply_func:proto::callable{//Dosomethingwithfunc};但是,函数本身是多态的,所以我不想指定它的确切签名。我希望我的代码看起来像这样的简化版本(出于技术原因我正在使用外部转换,我认为这与我当前的问题无关-没有它们我无法使递归工作):templateRplus_func(A0lhs,A1rhs){returnlhs+rhs;}templateRminus_func(A0lhs,A1rhs){returnlhs-rhs;}structmy_g