private void btnParse_Click(object sender, EventArgs e)
{
txtMessages.Clear();
pnlErrors.Controls.Clear();
_qlController = new QLController();
_errorYPos = 0;
//build AST + check types
_qlController.BuildAST(txtInput.Text);
foreach (string lexerError in _qlController.LexerErrors)
WriteMessage(lexerError);
if(_qlController.LexerErrors.Any())
WriteErrorLabel("Lexer errors occurred, see messages");
foreach (string parserError in _qlController.ParserErrors)
WriteMessage(parserError);
if(_qlController.ParserErrors.Any())
WriteErrorLabel("Parser errors occurred, see messages");
//get type errors
QLTypeChecker typeChecker = _qlController.TypeChecker;
foreach (QLTypeError typeError in typeChecker.TypeErrors.OrderBy((te) => te.IsWarning))
{
string error = string.Format("{5} QLTypeChecker: {0} {1}" +
"<At token '{2}' on line {3}, column {4}>",
typeError.Message, Environment.NewLine,
typeError.TokenInfo.TokenText,
typeError.TokenInfo.TokenLine,
typeError.TokenInfo.TokenColumn,
typeError.IsWarning ? "(Warning)" : "(Error)");
WriteErrorLabel(error, typeError.IsWarning);
}
WriteMessage(string.Format(@"Generated parse tree:
{0} {1}"
, Environment.NewLine
, _qlController.GetParseTreeString()));
//check if generate is possible
if (_qlController.LexerErrors.Any() || _qlController.ParserErrors.Any() || typeChecker.TypeErrors.Any((te) => !te.IsWarning))
lblSuccess.Visible = btnGenerate.Enabled = false;
else
lblSuccess.Visible = btnGenerate.Enabled = true;
}