diff --git a/Parsers/PascalABCParserNewSaushkin/Keywords.cs b/Parsers/PascalABCParserNewSaushkin/Keywords.cs new file mode 100644 index 000000000..11648d795 --- /dev/null +++ b/Parsers/PascalABCParserNewSaushkin/Keywords.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace GPPGParserScanner +{ + // Статический класс, определяющий ключевые слова языка + public static class Keywords + { + private static Dictionary keywords = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + + public static Dictionary keymap = new Dictionary(); + + public static string fname = "keywordsmap.pabc"; + public static void ReloadKeyMap() + { + try + { + if (keymap != null) + { + keymap.Clear(); + keymap = null; + } + var fn = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName), fname); + if (System.IO.File.Exists(fn)) + keymap = System.IO.File.ReadLines(fn,Encoding.Unicode).Select(s=>s.Split(new char[] { ' ' },StringSplitOptions.RemoveEmptyEntries)).ToDictionary(w => w[0], w => w[1]); + } + catch(Exception e) // погасить любые исключения + { + //var w = e.Message; + } + } + public static string Convert(string s) + { + if (keymap == null || keymap.Count() == 0) + return s; + else if (!keymap.ContainsKey(s)) + return s; + else return keymap[s]; + } + + public static void KeywordsAdd() + { + if (keymap == null || keymap.Count() == 0) + ReloadKeyMap(); + keywords.Clear(); + keywords.Add(Convert("or"), (int)Tokens.tkOr); + keywords.Add(Convert("xor"), (int)Tokens.tkXor); + keywords.Add(Convert("and"), (int)Tokens.tkAnd); + keywords.Add(Convert("div"), (int)Tokens.tkDiv); + keywords.Add(Convert("mod"), (int)Tokens.tkMod); + keywords.Add(Convert("shl"), (int)Tokens.tkShl); + keywords.Add(Convert("shr"), (int)Tokens.tkShr); + keywords.Add(Convert("not"), (int)Tokens.tkNot); + keywords.Add(Convert("as"), (int)Tokens.tkAs); + keywords.Add(Convert("in"), (int)Tokens.tkIn); + keywords.Add(Convert("is"), (int)Tokens.tkIs); + keywords.Add(Convert("implicit"), (int)Tokens.tkImplicit); + keywords.Add(Convert("explicit"), (int)Tokens.tkExplicit); + keywords.Add(Convert("sizeof"), (int)Tokens.tkSizeOf); + keywords.Add(Convert("typeof"), (int)Tokens.tkTypeOf); + keywords.Add(Convert("where"), (int)Tokens.tkWhere); + keywords.Add(Convert("array"), (int)Tokens.tkArray); + keywords.Add(Convert("begin"), (int)Tokens.tkBegin); + keywords.Add(Convert("case"), (int)Tokens.tkCase); + keywords.Add(Convert("class"), (int)Tokens.tkClass); + keywords.Add(Convert("const"), (int)Tokens.tkConst); + keywords.Add(Convert("constructor"), (int)Tokens.tkConstructor); + keywords.Add(Convert("default"), (int)Tokens.tkDefault); + keywords.Add(Convert("destructor"), (int)Tokens.tkDestructor); + keywords.Add(Convert("downto"), (int)Tokens.tkDownto); + keywords.Add(Convert("do"), (int)Tokens.tkDo); + keywords.Add(Convert("else"), (int)Tokens.tkElse); + keywords.Add(Convert("end"), (int)Tokens.tkEnd); + keywords.Add(Convert("event"), (int)Tokens.tkEvent); + keywords.Add(Convert("except"), (int)Tokens.tkExcept); + keywords.Add(Convert("exports"), (int)Tokens.tkExports); + keywords.Add(Convert("file"), (int)Tokens.tkFile); + keywords.Add(Convert("finalization"), (int)Tokens.tkFinalization); + keywords.Add(Convert("finally"), (int)Tokens.tkFinally); + keywords.Add(Convert("for"), (int)Tokens.tkFor); + keywords.Add(Convert("foreach"), (int)Tokens.tkForeach); + keywords.Add(Convert("function"), (int)Tokens.tkFunction); + keywords.Add(Convert("goto"), (int)Tokens.tkGoto); + keywords.Add(Convert("if"), (int)Tokens.tkIf); + keywords.Add(Convert("implementation"), (int)Tokens.tkImplementation); + keywords.Add(Convert("inherited"), (int)Tokens.tkInherited); + keywords.Add(Convert("initialization"), (int)Tokens.tkInitialization); + keywords.Add(Convert("interface"), (int)Tokens.tkInterface); + keywords.Add(Convert("label"), (int)Tokens.tkLabel); + keywords.Add(Convert("lock"), (int)Tokens.tkLock); + keywords.Add(Convert("nil"), (int)Tokens.tkNil); + keywords.Add(Convert("procedure"), (int)Tokens.tkProcedure); + keywords.Add(Convert("of"), (int)Tokens.tkOf); + keywords.Add(Convert("operator"), (int)Tokens.tkOperator); + keywords.Add(Convert("property"), (int)Tokens.tkProperty); + keywords.Add(Convert("raise"), (int)Tokens.tkRaise); + keywords.Add(Convert("record"), (int)Tokens.tkRecord); + keywords.Add(Convert("repeat"), (int)Tokens.tkRepeat); + keywords.Add(Convert("set"), (int)Tokens.tkSet); + keywords.Add(Convert("try"), (int)Tokens.tkTry); + keywords.Add(Convert("type"), (int)Tokens.tkType); + keywords.Add(Convert("then"), (int)Tokens.tkThen); + keywords.Add(Convert("to"), (int)Tokens.tkTo); + keywords.Add(Convert("until"), (int)Tokens.tkUntil); + keywords.Add(Convert("uses"), (int)Tokens.tkUses); + keywords.Add(Convert("var"), (int)Tokens.tkVar); + keywords.Add(Convert("while"), (int)Tokens.tkWhile); + keywords.Add(Convert("with"), (int)Tokens.tkWith); + keywords.Add(Convert("program"), (int)Tokens.tkProgram); + keywords.Add(Convert("template"), (int)Tokens.tkTemplate); + keywords.Add(Convert("packed"), (int)Tokens.tkPacked); + keywords.Add(Convert("resourcestring"), (int)Tokens.tkResourceString); + keywords.Add(Convert("threadvar"), (int)Tokens.tkThreadvar); + keywords.Add(Convert("sealed"), (int)Tokens.tkSealed); + keywords.Add(Convert("partial"), (int)Tokens.tkPartial); + keywords.Add(Convert("params"), (int)Tokens.tkParams); + keywords.Add(Convert("unit"), (int)Tokens.tkUnit); + keywords.Add(Convert("library"), (int)Tokens.tkLibrary); + keywords.Add(Convert("external"), (int)Tokens.tkExternal); + keywords.Add(Convert("name"), (int)Tokens.tkName); + keywords.Add(Convert("private"), (int)Tokens.tkPrivate); + keywords.Add(Convert("protected"), (int)Tokens.tkProtected); + keywords.Add(Convert("public"), (int)Tokens.tkPublic); + keywords.Add(Convert("internal"), (int)Tokens.tkInternal); + keywords.Add(Convert("read"), (int)Tokens.tkRead); + keywords.Add(Convert("write"), (int)Tokens.tkWrite); + keywords.Add(Convert("on"), (int)Tokens.tkOn); + keywords.Add(Convert("forward"), (int)Tokens.tkForward); + keywords.Add(Convert("abstract"), (int)Tokens.tkAbstract); + keywords.Add(Convert("overload"), (int)Tokens.tkOverload); + keywords.Add(Convert("reintroduce"), (int)Tokens.tkReintroduce); + keywords.Add(Convert("override"), (int)Tokens.tkOverride); + keywords.Add(Convert("virtual"), (int)Tokens.tkVirtual); + keywords.Add(Convert("extensionmethod"), (int)Tokens.tkExtensionMethod); + keywords.Add(Convert("new"), (int)Tokens.tkNew); + keywords.Add(Convert("auto"), (int)Tokens.tkAuto); + keywords.Add(Convert("sequence"), (int)Tokens.tkSequence); + keywords.Add(Convert("yield"), (int)Tokens.tkYield); + } + + static Keywords() + { + KeywordsAdd(); + } + + public static int KeywordOrIDToken(string s) + { + //s = s.ToUpper(); + int keyword = 0; + if (keywords.TryGetValue(s, out keyword)) + return keyword; + else + return (int)Tokens.tkIdentifier; + } + } + +} diff --git a/StandardSyntaxTreeConverter/StandardSyntaxConverters.cs b/StandardSyntaxTreeConverter/StandardSyntaxConverters.cs index 8b977ed69..ef491d09a 100644 --- a/StandardSyntaxTreeConverter/StandardSyntaxConverters.cs +++ b/StandardSyntaxTreeConverter/StandardSyntaxConverters.cs @@ -12,6 +12,7 @@ namespace PascalABCCompiler.SyntaxTreeConverters public syntax_tree_node Convert(syntax_tree_node root) { //FillParentNodeVisitor.New.ProcessNode(root); // прошивание ссылками на Parent nodes + // Пока нельзя вызывать - если это делать, то ObjectCopier.Clone провоцирует катастрофически долгое время работы!!! return root; } } diff --git a/SyntaxTree/tree/TreeHelper.cs b/SyntaxTree/tree/TreeHelper.cs index 5c9e42b71..cb89b56ce 100644 --- a/SyntaxTree/tree/TreeHelper.cs +++ b/SyntaxTree/tree/TreeHelper.cs @@ -28,7 +28,7 @@ namespace PascalABCCompiler.SyntaxTree public partial class syntax_tree_node { - public syntax_tree_node Parent; + public object Parent; public int FindIndex(syntax_tree_node node) { int ind = -1; diff --git a/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs b/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs index 0e2bcf2b6..a6d60e1af 100644 --- a/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs +++ b/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs @@ -917,7 +917,7 @@ namespace SyntaxVisitors LoweringYieldSequenceVisitor.Accept(pd); // frninja 31/05/16 - добавляем метод-хелпер, возьмет на себя проверку разных ошибок уже существующим бэкендом - CreateErrorCheckerHelper(pd); // SSM 14/07/16 - переставил до переименования переменных чтобы отлавливались ошибки одинаковых имен в разных пространствах имен + //CreateErrorCheckerHelper(pd); // SSM 14/07/16 - переставил до переименования переменных чтобы отлавливались ошибки одинаковых имен в разных пространствах имен // SSM - можно сделать спец визитор, который бы отлавливал дубли имен - тогда этого не надо // Переименовываем одинаковые имена в мини-ПИ: begin var a := 1 end; begin var a := 1 end; @@ -989,10 +989,6 @@ namespace SyntaxVisitors //mids = null; // вдруг мы выйдем из процедуры, не зайдем в другую, а там - оператор! Такого конечно не может быть } - - public override void visit(yield_node yn) - { - } } /*class ConstructFiniteAutomata1