foundationdb/flow/actorcompiler/ParseTree.cs

252 lines
6.8 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* ParseTree.cs
*
* This source file is part of the FoundationDB open source project
*
* Copyright 2013-2018 Apple Inc. and the FoundationDB project authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace actorcompiler
{
class VarDeclaration
{
public string type;
public string name;
public string initializer;
public bool initializerConstructorSyntax;
};
abstract class Statement
{
public int FirstSourceLine;
public virtual bool containsWait()
{
return false;
}
};
class PlainOldCodeStatement : Statement
{
public string code;
public override string ToString()
{
return code;
}
};
class StateDeclarationStatement : Statement
{
public VarDeclaration decl;
public override string ToString()
{
if (decl.initializerConstructorSyntax)
return string.Format("State {0} {1}({2});", decl.type, decl.name, decl.initializer);
else
return string.Format("State {0} {1} = {2};", decl.type, decl.name, decl.initializer);
}
};
class WhileStatement : Statement
{
public string expression;
public Statement body;
public override bool containsWait()
{
return body.containsWait();
}
};
class ForStatement : Statement
{
public string initExpression = "";
public string condExpression = "";
public string nextExpression = "";
public Statement body;
public override bool containsWait()
{
return body.containsWait();
}
};
class RangeForStatement : Statement
{
public string rangeExpression;
public string rangeDecl;
public Statement body;
public override bool containsWait()
{
return body.containsWait();
}
};
class LoopStatement : Statement
{
public Statement body;
public override string ToString()
{
return "Loop " + body.ToString();
}
public override bool containsWait()
{
return body.containsWait();
}
};
class BreakStatement : Statement
{
};
class ContinueStatement : Statement
{
};
class IfStatement : Statement
{
public string expression;
public Statement ifBody;
public Statement elseBody; // might be null
public override bool containsWait()
{
return ifBody.containsWait() || (elseBody != null && elseBody.containsWait());
}
};
class ReturnStatement : Statement
{
public string expression;
public override string ToString()
{
return "Return " + expression;
}
};
class WaitStatement : Statement
{
public VarDeclaration result;
public string futureExpression;
public bool resultIsState;
public bool isWaitNext;
public override string ToString()
{
return string.Format("Wait {0} {1} <- {2} ({3})", result.type, result.name, futureExpression, resultIsState ? "state" : "local");
}
public override bool containsWait()
{
return true;
}
};
class ChooseStatement : Statement
{
public Statement body;
public override string ToString()
{
return "Choose " + body.ToString();
}
public override bool containsWait()
{
return body.containsWait();
}
};
class WhenStatement : Statement
{
public WaitStatement wait;
public Statement body;
public override string ToString()
{
return string.Format("When ({0}) {1}", wait, body);
}
public override bool containsWait()
{
return true;
}
};
class TryStatement : Statement
{
public struct Catch
{
public string expression;
public Statement body;
public int FirstSourceLine;
};
public Statement tryBody;
public List<Catch> catches;
public override bool containsWait()
{
if (tryBody.containsWait())
return true;
foreach (Catch c in catches)
if (c.body.containsWait())
return true;
return false;
}
};
class ThrowStatement : Statement
{
public string expression;
};
class CodeBlock : Statement
{
public Statement[] statements;
public override string ToString()
{
return string.Join("\n",
new string[] { "CodeBlock" }
.Concat(statements.Select(s => s.ToString()))
.Concat(new string[] { "EndCodeBlock" })
.ToArray());
}
public override bool containsWait()
{
foreach (Statement s in statements)
if (s.containsWait())
return true;
return false;
}
};
class Declaration
{
public string type;
public string name;
public string comment;
};
class Actor
{
public List<string> attributes = new List<string>();
public string returnType;
public string name;
public string enclosingClass = null;
public VarDeclaration[] parameters;
public VarDeclaration[] templateFormals; //< null if not a template
public CodeBlock body;
public int SourceLine;
public bool isStatic = false;
private bool isUncancellable;
public string testCaseParameters = null;
public string nameSpace = null;
public bool isForwardDeclaration = false;
public bool isTestCase = false;
public bool IsCancellable() { return returnType != null && !isUncancellable; }
public void SetUncancellable() { isUncancellable = true; }
};
class Descr
{
public string name;
public string superClassList;
public List<Declaration> body;
};
};