public NonTerminal Parse(string file)
{
using (var stream = new StreamReader(file))
{
var parser = new Parser(stream, grammar);
parser.TrimReductions = true;
while (true)
{
var result = parser.Parse();
switch (result)
{
case ParseMessage.InternalError:
throw new InvalidOperationException("Internal error in parser");
case ParseMessage.LexicalError:
throw new InvalidOperationException(string.Format("Lexical error: (line:{0}) {1}", parser.TokenLineNumber, parser.TokenText));
case ParseMessage.SyntaxError:
throw new InvalidOperationException(string.Format("Syntax error: (line:{0}) {1}\n -- Expected: {2}", parser.LineNumber, parser.LineText,
string.Join<Symbol>(", ", parser.GetExpectedTokens())));
case ParseMessage.TokenRead:
var terminal = new Terminal(parser.TokenSymbol, parser.TokenText);
parser.TokenSyntaxNode = terminal;
break;
case ParseMessage.Reduction:
var nonTerminal = new NonTerminal(parser.ReductionRule);
parser.TokenSyntaxNode = nonTerminal;
for (int i = 0; i < parser.ReductionCount; i++)
nonTerminal.Add(parser.GetReductionSyntaxNode(i));
break;
case ParseMessage.Accept:
return parser.TokenSyntaxNode as NonTerminal;
}
}
}
}