private void ProcessExistID(string value) { // Find in declarations int wasDeclaratedIndex = -1; for (int j = 0; j < IDs.Count; j++) { if (value == IDs[j]) { wasDeclaratedIndex = j; break; } } // It hasn't declarated. if (wasDeclaratedIndex == -1) { Out.Log(Out.State.LogInfo, ""); LexemException error2 = new LexemException((line + 1), "Variable " + value + " hasn't declarated"); throw error2; } // Fuuuh. I've find it. else { Lexems.Add(new Lexem(line, value, dict.Count - 2)); Out.Log(Out.State.LogInfo, dict.Count - 1 + "\t" + (wasDeclaratedIndex + 1)); } }
// Analyzing // private void AnalyzeConst(string value) { // Tabel base // PrintBaseTableLine(value); // Check earlier definition // int wasDeclaratedIndex = -1; for (int j = 0; j < CONSTs.Count; j++) { if (value == CONSTs[j]) { wasDeclaratedIndex = j; break; } } // It hasn't declarated. if (wasDeclaratedIndex == -1) { CONSTs.Add(value); Lexems.Add(new Lexem(line, value, dict.Count - 1)); Out.Log(Out.State.LogInfo, dict.Count + "\t\t" + CONSTs.Count); } else { Out.Log(Out.State.LogInfo, dict.Count + "\t\t" + (wasDeclaratedIndex + 1)); Lexems.Add(new Lexem(line, value, dict.Count - 1)); } }
private void InsertNewID(string value) { int wasDeclaratedIndex = -1; for (int j = 0; j < IDs.Count; j++) { if (value == IDs[j]) { wasDeclaratedIndex = j; break; } } // It hasn't declarated. if (wasDeclaratedIndex != -1) { Out.Log(Out.State.LogInfo, ""); throw new LexemException((line + 1), "Variable " + value + " has declarated earlier"); } else { // Declaration zone // IDs.Add(value); Lexems.Add(new Lexem(line, value, dict.Count - 2)); Out.Log(Out.State.LogInfo, dict.Count - 1 + "\t" + IDs.Count); } }
public static void CheckSyntax(Lexems lexemcheck) { if (currentLexem != lexemcheck) { Error(" ожидолос " + lexemcheck); } // else // ParseNextLexem(); }
public static void AddKeyWord(string Keyword, Lexems lexem) { Keyword kw = new Keyword { word = Keyword, lex = lexem }; Keywords.Add(kw); }
// override object.Equals public override bool Equals(object obj) { if (obj == null || GetType() != obj.GetType()) { return(false); } TokenDto t = (TokenDto)obj; return((Orth == t.Orth) && (NoSpaceBefore == t.NoSpaceBefore) && (Lexems.All(t.Lexems.Contains) && Lexems.Count == t.Lexems.Count)); }
public static void ParseNumber() { string Num = ""; do { Num += (char)Reader.CurSymbol; Reader.ReadNextSymbol(); } while (char.IsDigit((char)Reader.CurSymbol)); currentName = Num; currentLexem = Lexems.Number; }
public static void ParseID() { string ID = ""; do { ID += (char)Reader.CurSymbol; Reader.ReadNextSymbol(); }while (char.IsLetter((char)Reader.CurSymbol)); currentName = ID; currentLexem = GetKeyWord(ID); }
public static void CheckLexems(Lexems ExpectedLexem) { ParseNextLexem(); if (currentLexem != ExpectedLexem) { Error("ожидалось " + ExpectedLexem.ToString()); } else { ParseNextLexem(); } }
public void ReadXml(XmlReader reader) { reader.MoveToContent(); //orth tag if (reader.Read() && reader.IsStartElement()) { Orth = reader.ReadElementContentAsString(); } //if string is parsed first time if (_chunkListMetaData != null) { _chunkListMetaData.NumberOfTokens += 1; //if word isn't in lookUpDictionary if (_chunkListMetaData.WordsLookupDictionary.ContainsKey(Orth)) { _chunkListMetaData.WordsLookupDictionary[Orth].Add(_chunkListMetaData.NumberOfChunks); } else { var list = new List <int>(); list.Add(_chunkListMetaData.NumberOfChunks); _chunkListMetaData.WordsLookupDictionary.Add(Orth, list); } } //lex tags while (reader.IsStartElement()) { LexemDto lex = new LexemDto(); lex.ReadXml(reader.ReadSubtree()); Lexems.Add(lex); if (reader.NodeType == XmlNodeType.EndElement || reader.NodeType == XmlNodeType.Whitespace) { reader.Skip(); } } }
static void Main() { Lexems.LexTokList lexMas = new Lexems.LexTokList(); lexMas = Lexems.GetLexem(); lexMas.Display(); Console.WriteLine(); Parser p = new Parser(lexMas); try { p.ClassDecl(); Console.WriteLine("Compilation complete success."); } catch (ParseException e) { Console.WriteLine(e.Message + " CountLine: " + e.Value); } Console.ReadKey(); }
Lexem ReservedLexem(ref int row, string substring) { if (substring == Environment.NewLine) { Lexems.Add(new Lexem(row, "¶", 3)); row++; } else { int code = Check.IsReservedLexem(substring); if (code != -1) { Lexems.Add(new Lexem(row, substring, code)); } else { throw new Exception($"Oops, I can`t understand constant '{substring}' in {row} row"); } } return(null); }
public static void ParseNextLexem() { while (Reader.CurSymbol == ' ') { Reader.ReadNextSymbol(); } if (char.IsLetter((char)Reader.CurSymbol)) { ParseID(); } else if (char.IsDigit((char)Reader.CurSymbol)) { ParseNumber(); } else if (Reader.CurSymbol == '\r' || Reader.CurSymbol == '\n') { Reader.ReadNextSymbol(); ParseNextLexem(); } else if (Reader.CurSymbol == '<') { //currentLexem = Lexems.Less; Reader.ReadNextSymbol(); if (Reader.CurSymbol == '=') { currentLexem = Lexems.LessOrEqual; currentName = "<="; Reader.ReadNextSymbol(); return; } else { currentName = "<"; currentLexem = Lexems.Less; Reader.ReadNextSymbol(); } } else if (Reader.CurSymbol == '+') { currentLexem = Lexems.Plus; currentName = "+"; Reader.ReadNextSymbol(); } else if (Reader.CurSymbol == '-') { currentLexem = Lexems.Minus; currentName = "-"; Reader.ReadNextSymbol(); } else if (Reader.CurSymbol == '*') { currentLexem = Lexems.Multiplication; currentName = "*"; Reader.ReadNextSymbol(); } else if (Reader.CurSymbol == '/') { currentLexem = Lexems.Division; currentName = "/"; Reader.ReadNextSymbol(); } else if (Reader.CurSymbol == '>') { Reader.ReadNextSymbol(); if (Reader.CurSymbol == '=') { currentLexem = Lexems.GreaterOrEqual; currentName = ">="; Reader.ReadNextSymbol(); return; } currentLexem = Lexems.Greater; currentName = ">"; } else if (Reader.CurSymbol == '(') { currentLexem = Lexems.LesfBracket; currentName = "("; Reader.ReadNextSymbol(); } else if (Reader.CurSymbol == ')') { currentLexem = Lexems.RightBracket; currentName = ")"; Reader.ReadNextSymbol(); } else if (Reader.CurSymbol == ',') { currentLexem = Lexems.Comma; currentName = ","; Reader.ReadNextSymbol(); } else if (Reader.CurSymbol == ';') { currentLexem = Lexems.EndOfOPeration; currentName = ";"; Reader.ReadNextSymbol(); } else if (Reader.CurSymbol == '&') { currentLexem = Lexems.Conjuction; currentName = "&"; Reader.ReadNextSymbol(); } else if (Reader.CurSymbol == '|') { currentLexem = Lexems.Disjunction; currentName = "|"; Reader.ReadNextSymbol(); } else if (Reader.CurSymbol == '!') { currentLexem = Lexems.ExcMark; currentName = "!"; Reader.ReadNextSymbol(); if (Reader.CurSymbol == '=') { currentLexem = Lexems.NotEqual; currentName = "!" + (char)Reader.CurSymbol; Reader.ReadNextSymbol(); } } else if (Reader.CurSymbol == 0) { currentLexem = Lexems.EndOfF; } else if (Reader.CurSymbol == ':') { Reader.ReadNextSymbol(); if (Reader.CurSymbol == '=') { currentLexem = Lexems.Assign; currentName = ":" + (char)Reader.CurSymbol; Reader.ReadNextSymbol(); } } else if (Reader.CurSymbol == '=') { Reader.ReadNextSymbol(); if (Reader.CurSymbol == '=') { currentName = "=" + (char)Reader.CurSymbol; currentLexem = Lexems.Equal; Reader.ReadNextSymbol(); } else { currentLexem = Lexems.Assign; currentName = "" + (char)Reader.CurSymbol; } } else { throw new Exception("Unknown Symbol " + (char)Reader.CurSymbol); } }
string isBinaryOperand(Lexems.Lexema l) { if (l == null) return null; switch (l.GetType().Name) { case "BinOperAnd": return "and"; case "BinOperOr": return "or"; case "BinOperXor": return "xor"; default: return null; } }