gpt4 book ai didi

c# - Irony 中的可选表达式

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:13 24 4
gpt4 key购买 nike

我是 Irony 编程的新手。我正在处理的第一个测试示例是计算数学形状(面积、体积……)

在简单模式下,它工作正常。但挑战是我想让它成为可选的。例如,如果我选择圆形作为形状,那么我只需要半径。另外,如果我选择矩形作为形状,我需要高度和宽度。所以,我想知道如何在形状为圆形时获取一个数字作为半径,以及在形状为矩形时如何获取 2 或 3 个数字。

            var program = new NonTerminal("program");
var shapeType = new NonTerminal("shapeType");
var shapeTypes = new NonTerminal("shapeTypes");
var circle = new NonTerminal("circle");
var square = new NonTerminal("square");
var rectangle = new NonTerminal("rectangle");
var triangle = new NonTerminal("triangle");
var commandList = new NonTerminal("commandList");
var command = new NonTerminal("command");
var width = new NonTerminal("width");
var height = new NonTerminal("height");
var length = new NonTerminal("length");
var radius = new NonTerminal("radius");
var number = new NumberLiteral("number");
var operation = new NonTerminal("operation");

this.Root = program;

program.Rule = shapeType + radius + commandList |
shapeType + length + commandList |
shapeType + width + commandList |
shapeType + length + width + commandList |
shapeType + height + commandList |
shapeType + length + width + height + commandList;
shapeType.Rule = Symbol("set") + "shape" + ":" + shapeTypes + ".";
shapeTypes.Rule = Symbol("circle") | "square" | "rectangle" | "triangle";
radius.Rule = Symbol("set") + "radius" + ":" + number + ".";
height.Rule = Symbol("set") + "height" + ":" + number + ".";
width.Rule = Symbol("set") + "width" + ":" + number + ".";
length.Rule = Symbol("set") + "length" + ":" + number + ".";

triangle.Rule = height + width | height + width + length;
rectangle.Rule = height + width | height + width + length;
square.Rule = height + width | height + width + length;
circle.Rule = radius;
operation.Rule = Symbol("area") | "volume";
commandList.Rule = MakeStarRule(commandList, null, command);
command.Rule = Symbol("what") + "is" + operation + ".";

它的行为是这样的:对于圆形示例,我希望我的代码只接收半径而不接收更多(如下面的代码 - list 1)。但是,当语法类似于 list 2 时,它也可以工作。所以,我希望在编译时有特定的情况。

list 1

set shape : circle.
set radius : 10.
what is area.

list 2

set shape : circle.
set length : 10.
set width : 5.
what is area.

它们都产生相同的答案,我们知道 list 2 的参数是错误的。

最佳答案

我明白你想做什么,但是,这种“条件”行为不是使用语法完成的——这会使语法更难理解,维护起来更难,而且也不是那么容易。

相反,你将拥有你所拥有的。将输入字符串传递给 Irony 后,它会返回一个“解析树”:How to Generate and display ParseTree for an expression in C# using Irony?

parse tree 还可以进一步转化为 AST(abstract synax tree),Irony 也有这方面的示例。

一旦有了解析树/AST,就必须对标记进行简单分析,并标记所有不当行为。

通过分析,我的意思是迭代标记,保留某种“上下文信息”。

本质上,逻辑将如下所示:

if set shape was set to circle:
if set length exists
return true; // nothing wrong here, we can calculate area.
if set length exists and set width exists
return true;

return false; // error: we can't decide it..

希望对您有所帮助。 Irony 还提供了如何使用解释器构建实际编程语言的简单示例。

关于c# - Irony 中的可选表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27166309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com