public void AddModule(Module module) { Modules.Add(module.Name, module); ParentNode<Keywords> current = module; var name = module.Name; while (true) { var parent = GetParent(current); if (parent != null && parent != Root) { current = parent; name = current.Name + "." + name; continue; } break; } Identifers.Add(name, module); }
/// <summary> /// "module" Ident { Statement } ("endmod"|"endmodule") /// </summary> private void ModuleStatement() { NextToken(); var module = new Module(ModuleName()); AST.EnterTo(module); AST.AddModule(module); while (TokType != TokenType.EndFile) { if (TokType == TokenType.EndLine) { NextToken(); continue; } if (IfKeyword("endmod", "endmodule")) { AST.Leave(); NextToken(); return; } IfError(!Statement(), "Ожидается оператор"); } throw new ApplicationException("Неожиданный конец файла"); }
private void DefineMacroStatement() { NextToken(); var macro = new Module(Identifer()); AST.EnterTo(macro); AST.AddModule(macro); while (TokType != TokenType.EndFile) { if (TokType == TokenType.EndLine) { NextToken(); continue; } if (IfKeyword("endm")) { AST.Leave(); NextToken(); return; } if (TokType == TokenType.TempLabel) throw new ApplicationException($"В макросах запрещенно использовать временные метки, в позиции {Token.Position}"); IfError(!Statement(), $"Ожидается оператор, в позиции {Token.Position}"); } throw new ApplicationException("Неожиданный конец файла"); }