protected virtual bool Statement() { if (IsLabel()) { var label = new LabelNode(Token.Value) {Type = TokType}; if (TokType == TokenType.LocalLabel) { if (_lastRegularLabel != null) label.BaseLabel = _lastRegularLabel; else throw new ApplicationException($"Перед локальной меткой нет регулярной метки, в позиции {Token.Position}"); } if (TokType == TokenType.Label) _lastRegularLabel = label; AST.Add(label); NextToken(); return true; } if (!IsKeyword()) return false; var kw = _keywords[Keyword]; switch (kw.Value) { case Keywords.Include: // TODO загрузить файл и создать новый экземпляр парсера NextToken(); NextToken(); break; case Keywords.Module: ModuleStatement(); break; case Keywords.If: case Keywords.Ifn: case Keywords.IfUsed: case Keywords.IfnUsed: IfStatement(); break; case Keywords.Macro: DefineMacroStatement(); break; case Keywords.Dup: DupStatement(); break; default: throw new ApplicationException($"неожиданное ключенов слово: {Keyword} , в позиции {Token.Position}"); } return true; }
private void DupStatement() { NextToken(); var dup = new DupNode(Expression()); AST.EnterTo(dup); while (TokType != TokenType.EndFile) { if (TokType == TokenType.EndLine) { NextToken(); continue; } if (IfKeyword("edup", "erept")) { AST.Leave(); NextToken(); _lastRegularLabel = null; return; } IfError(!Statement(), "Ожидается оператор"); } }