private IBfsArray ConvertArrayExtension(PegNode node)
{
EBinaryFileSchemaParser type = GetNodeId(node);
if (type != EBinaryFileSchemaParser.arrayknown && type != EBinaryFileSchemaParser.arrayunknown)
throw new AstConvertException("Must be an array extension! : " + GetNodeText(node));
//Known sized array extensions
if (type == EBinaryFileSchemaParser.arrayknown)
{
BfsKnownArray knownarray = new BfsKnownArray();
StoreSourceRange(node, knownarray);
knownarray.Expression = ConvertExpression(node.child_);
return knownarray;
}
//Unknown sized
else
{
BfsUnknownArray unknownarray = new BfsUnknownArray();
StoreSourceRange(node, unknownarray);
unknownarray.UntilSourceRange = GetSourceRange(node.child_);
for (PegNode stopcasenode = node.child_.next_; stopcasenode != null; stopcasenode = stopcasenode.next_)
{
IBfsStopCase stopcase = null;
if (GetNodeId(stopcasenode) == EBinaryFileSchemaParser.stopcase)
{
switch( GetNodeId(stopcasenode.child_) )
{
case EBinaryFileSchemaParser.p_string:
BfsStopCaseString stopstring = new BfsStopCaseString();
stopstring.StopString = GetNodeText(stopcasenode.child_);
stopcase = stopstring;
break;
case EBinaryFileSchemaParser.EOF:
stopcase = new BfsStopCaseEndOfFile();
break;
case EBinaryFileSchemaParser.hex:
BfsStopCaseHex stophex = new BfsStopCaseHex();
stophex.HexString = GetNodeText(stopcasenode.child_);
stopcase = stophex;
break;
default:
throw new Exception("Unknown stopcase type : " + GetNodeId(stopcasenode.child_));
}
stopcase.Inclusion = BfsInclusionEnum.Skipped;
stopcase.SourceRange = GetSourceRange(stopcasenode.child_);
//Inclusion and consumption
for (PegNode bnode = stopcasenode.child_.next_; bnode != null; bnode = bnode.next_)
{
if (GetNodeId(bnode) == EBinaryFileSchemaParser.inclusion)
{
stopcase.InclusionSourceRange = GetSourceRange(bnode);
if (GetNodeText(bnode) == "included")
stopcase.Inclusion = BfsInclusionEnum.Included;
else if (GetNodeText(bnode) == "excluded")
stopcase.Inclusion = BfsInclusionEnum.Excluded;
else if (GetNodeText(bnode) == "skipped")
stopcase.Inclusion = BfsInclusionEnum.Skipped;
}
}
unknownarray.StopCases.Add(stopcase);
}
else if (GetNodeId(stopcasenode) == EBinaryFileSchemaParser.or_keyword)
unknownarray.OrWords.Add(GetSourceRange(stopcasenode));
}
return unknownarray;
}
}