问题标签 [irony]
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.
parsing - 解决我的语法中的 shift-reduce 冲突的问题
我正在尝试用Irony编写一个小型解析器。不幸的是,我遇到了“减少班次冲突”。语法不是我的强项,我只需要完成这件小事。这是产生错误的简化语法:
“班次减少冲突”是什么意思,我该如何解决?我认为这意味着我的语法模棱两可,但我无法充分扭曲我的逻辑以了解如何。
补充:澄清 - “asd”只是一个文字字符串“asd”。所以我希望这个语法会解析以下表达式:
补充2:忘了说,语法的根是LogicalExpression
。
补充3:啊,我明白了!模棱两可是因为像这样的表达
可以用两种不同的方式来解释:
但是我该如何解决呢?好的,我可以将 AND 或 OR 中的一个设置为比另一个更强大(无论如何我都想这样做)。但是现在我看到即使只有一个操作员也会出现错误。换句话说,这也会产生同样的错误:
在这种情况下,我想要这个:
要解析为:
这样做的明确方式是什么?
补充4:知道了!
这会解析所有布尔表达式,运算符优先级为 NOT->AND->OR。“asd”可以替换为您的条款的表达方式。
c# - 帮助学习使用 Irony for .net
我正在努力跟上Irony的速度。我不断看到一些我还不理解的术语:终端、非终端、令牌、状态机、关联性、抽象语法树。
有人可以给其中一些术语一些含义吗?我一直在阅读有关 Irony 的精彩内容,因此您可以在学习如何使用它方面提供任何帮助。
粗体字编辑
parsing - 如何定义语法
我是语言处理的新手,我想用 Irony 创建一个解析器,语法如下:
其中 name1 是 xml 元素的名称,value 是元素的值,也可以包含空格。
我试图修改包含的样本,如下所示:
但如果值包含空格,这将不起作用。可以在不修改语法(例如在值周围添加引号)的情况下完成(使用 Irony)吗?
非常感谢!
visual-studio - 安装自定义 Visual Studio 语言服务
我按照非常有用的文章编写您的第一个 Visual Studio 语言服务的指导,为我的软件工作室的内部脚本语言编写了一个新的 Visual Studio 语言服务。我的语法运行良好,一些简单的 goto 案例启动并运行,以及文本着色。我已经在 Irony GrammarExplorer 和 Visual Studio Experimental Hive 中完成了我的测试,我觉得我已经准备好在 Visual Studio 中正常使用它,并将它部署给其他一些程序员进行一些早期测试和反馈。
问题是我不知道如何安装语言服务。我有一个在 Experimental Hive 中工作的漂亮的小 DLL,但不知道如何在我启动 Visual Studio 时运行它。我浏览了整个互联网,发现我所看到的任何地方都掩盖了特定的步骤。也许我只是个盲人,或者它比我想象的要容易得多,但如果有人能给我详细说明如何安装我的语言服务的步骤,我将不胜感激。
提前致谢!
c# - 讽刺:评估 AST 节点的教程?
我在Irony中定义了一个简单的语法,并生成了一个不错的紧凑 AST。
现在我想弄清楚如何评估它。问题是,我找不到任何关于如何做到这一点的教程。
我只定义了 2 个 AST 节点:
这将生成以下输出:
而我想要的输出是:
我不认为我应该使用Context.Write()
. 样本显示将东西推入context.Data
并弹出它们......但我不太确定它是如何工作的。
我猜pi
最后会被添加,因为它会自动推送到context.Data
最后一个元素会弹出?我不太确定。
一些指针或指向教程的链接会很好。
另外,我应该如何处理不同的节点类型?每个“标签”可以有 4 种不同类型的内容:另一个标签、字符串文字、变量或数字。我应该if(node is StringLiteral) ....
在EvaluateNode
方法中写东西还是什么?
我找到了这个,但他们只是遍历 AST 而没有利用EvaluateNode
.
然后这个替换数据堆栈中的单个值......但并没有真正解释它是如何输出的或任何东西。
需要明确的是,我特别想知道如何重写EvaluateNode
方法Irony.Ast.AstNode
来做我想做的事。
好的,我已经追踪到这一行末尾的那个花絮:
它包含在默认评估例程中......也许它适用于计算器应用程序,但在我的应用程序中并不多。现在试图弄清楚如何绕过脚本解释器,但后来我不知道如何设置全局变量。
c# - 讽刺:如何禁止 2 个标记之间有空格?
我正在尝试在Irony中定义 PHP 风格的变量,如下所示:
效果很好,除了你可以在$
和之间放置空格identifier
。我想阻止这种情况。如何?
我必须创建一个新的定制终端吗?如果是这样,我还能利用IdentifierTerminal
魔法吗?
挖掘IdentifierTerminal
我发现实际上有一个“NameIncludesPrefix”标志,但它只在一个地方使用。看起来前缀存储在这个CompoundTokenDetails
对象中......我不确定如何使用。编辑:没关系,这是一个死胡同。这些标志用于为变量的行为方式添加修饰符。
这有点工作...
我不太确定是什么OuputTerminal
。我猜这是基于当前预览位置的某种动态属性?我认为 Irony 中的解析方式有点奇怪......
无论如何,问题在于当我使用 this 时VariableTerminal
,而不是我之前使用 with"$" + IdentifierTerminal"
时的做法,当出现语法错误时,例如在这段代码中:
标识符终端曾经说过
语法错误,预期:{ 真正的字符串 $ 真假 ...
但是变量给了我这个错误:
无效字符:'c'
我认为前一个错误更有用。我真的不明白为什么它会吐出一个不同的错误......我怎样才能让它这么说呢?
parsing - C# 以外的其他语言的类似讽刺分析器的软件?
是否有任何程序可以执行Irony .NET 语言实现工具包的功能,但适用于其他编程语言?
c# - 如何定义“else”块?
这是我正在尝试的:
但我得到一个shift-reduce conflict
. 我不太清楚为什么......如果可以的话,它不应该贪婪地抓住“其他”吗?不太确定如何定义 else 块,使其后面只能跟一个“if”块。
我认为带有一个节点和一个节点的if_else
块节点是最佳的,因为当我尝试遍历 AST 时,我不必返回并检查前一个兄弟节点。if
else
如果您需要查看更多语法...请告诉我。“块”基本上定义为{ blah }
(之间的一堆语句{}
)。
尝试将其作为可选块:
也不喜欢这样。仍然抛出警告。
c# - 讽刺的是:如何让 KeyTerm 优先于变量?
Irony语法的相关块:
问题是“标签”和“变量”都可以出现在同一个地方。我希望我的解析器更喜欢标签而不是变量,但它总是更喜欢变量。我该如何改变呢?
我试过改成tag_blk.Rule
,PreferShiftHere() + html_tag_kw + attr_args_opt + block;
但ImplyPrecedenceHere(-100) + html_tag_kw + attr_args_opt + block;
没有任何帮助。解析器甚至不会抱怨歧义。
visual-studio-2010 - 我已经在 Irony 中创建了我的第一种语言,现在如何将它导入 Visual Studio 2010?
我尝试按照此操作,但在向导结束时出现错误。我不确定它是否与 2010 兼容。我正在Ook 上观看此视频,但我不确定如何将其与 Irony 联系起来。我认为 Irony 已经为我做了很多繁重的工作,我只是不知道如何让它很好地与ITaggerProvider
VS 公开的 100 个其他接口一起使用。我怎么做?