Crafting Interpreters
Bob Nystrom的书,并试图用C重新创建JLOX语言解释器。
JLOX中的“J”指的是本书中用Java实现的示例代码。
我曾试图将Java代码翻译成C,但现在遇到了以下编译器错误:
"ASTPrinter.VisitBinaryExpr(Expression.Binary): No suitable method found to override"
(单击以查看图像)
两个相关的代码文件是:
使用系统;
namespace CSharpLox
{
abstract public class Expression
{
abstract public T Accept<T>(Visitor<T> visitor);
public interface Visitor<T>
{
T VisitBinaryExpr(Binary expr);
// other expression type visitors removed for clarity...
}
public class Binary : Expression
{
public readonly Expression left;
public readonly Token _operator;
public readonly Expression right;
public Binary(Expression left, Token _operator, Expression right)
{
this.left = left;
this._operator = _operator;
this.right = right;
}
override public T Accept<T>(Visitor<T> visitor)
{
return visitor.VisitBinaryExpr(this);
}
}
// other expression types removed for clarity...
}
}
和
:
using System;
using System.Text;
namespace CSharpLox
{
// ASTPrinter.cs
public class ASTPrinter : Expression.Visitor<string>
{
override public string VisitBinaryExpr(Expression.Binary expression)
{
return parenthesize(expression._operator.lexeme, expression.left, expression.right);
}
private String parenthesize(String name, params Expression[] expressions)
{
StringBuilder builder = new StringBuilder();
builder.Append("(").Append(name);
foreach (Expression expression in expressions)
{
builder.Append(" ");
builder.Append(expression.Accept(this));
}
builder.Append(")");
return builder.ToString();
}
}
}
:
重写公共字符串VisitBinaryExpr(Expression.Binary Expression)
Visual Studio编辑器报告的错误文本为:
我想我只是对C#泛型返回类型了解得不够。
我一直在四处寻找有关泛型返回类型的信息,但到目前为止,我还没有找到一个明确的示例,说明它如何与抽象接口的具体实现交互。或者,这可能是C和Java的泛型功能差异太大,无法直接翻译实现的一个领域。