Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 24.96 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace C_LightParser.Models
  8. {
  9.     public class AnalyzerModel : BaseModel
  10.     {
  11.         public static List<RuleModel> AllRules = new List<RuleModel>();
  12.  
  13.         public static string[,] Table;
  14.  
  15.         public static int RowsCount = 0;
  16.         public static int ColumnsCount = 0;
  17.  
  18.         public static List<string> ToList(string str)
  19.         {
  20.             var result = new List<string>();
  21.             for (var i = 0; i < str.Length; i++)
  22.             {
  23.                 if (str[i] == '<')
  24.                 {
  25.                     for (int j = i; j < str.Length; j++)
  26.                     {
  27.                         if (str[j] == '>')
  28.                         {
  29.                             result.Add(str.Substring(i, j - i + 1));
  30.                             i = j;
  31.                             break;
  32.                         }
  33.                     }
  34.                 }
  35.  
  36.                 if (str[i] == '\'')
  37.                 {
  38.                     for (int j = i + 1; j < str.Length; j++)
  39.                     {
  40.                         if (str[j] == '\'')
  41.                         {
  42.                             result.Add(str.Substring(i, j - i + 1));
  43.                             i = j;
  44.                             break;
  45.                         }
  46.                     }
  47.                 }
  48.             }
  49.             return result;
  50.         }
  51.  
  52.         public static void GenerateTable()
  53.         {
  54.             var excelService = new ExcelService();
  55.             var terminals = new List<string>();
  56.             var nonTerminals = new List<string>();
  57.             foreach (var rule in AllRules)
  58.             {
  59.                 nonTerminals.Add(rule.NonTerminal);
  60.                 foreach (var list in rule.RuleSet)
  61.                 {
  62.                     foreach (var sets in list)
  63.                     {
  64.                         for (int i = 0; i < sets.Length; i++)
  65.                         {
  66.                             bool seekingTerminal = true;
  67.                             foreach (var terminal in terminals)
  68.                             {
  69.                                 if (terminal == sets[i])
  70.                                 {
  71.                                     seekingTerminal = false;
  72.                                     break;
  73.                                 }
  74.  
  75.                             }
  76.                             if (seekingTerminal)
  77.                             {
  78.                                 if ((sets[i][0] == '\'') && (sets[i][sets[i].Length - 1] == '\'')) terminals.Add(sets[i]);
  79.                             }
  80.                         }
  81.                     }
  82.                 }
  83.             }
  84.             terminals.Add("$");
  85.             Table = new string[nonTerminals.Count + 1, terminals.Count + 1];
  86.  
  87.             for (var i = 0; i < nonTerminals.Count + 1; i++)
  88.             {
  89.                 for (var j = 0; j < terminals.Count + 1; j++)
  90.                 {
  91.                     Table[i, j] = "NULL";
  92.                 }
  93.             }
  94.  
  95.             for (var i = 1; i < nonTerminals.Count + 1; i++)
  96.             {
  97.                 Table[i, 0] = nonTerminals[i - 1];
  98.             }
  99.  
  100.             for (var i = 1; i < terminals.Count + 1; i++)
  101.             {
  102.                 Table[0, i] = terminals[i - 1];
  103.             }
  104.  
  105.  
  106.             RowsCount = terminals.Count + 1;
  107.             ColumnsCount = nonTerminals.Count + 1;
  108.  
  109.             var finalList = new List<string>();
  110.             var resultList = new List<string>();
  111.             var ruleList = new List<string[]>();
  112.  
  113.             int row = 1;
  114.  
  115.             foreach (var rule in AllRules)
  116.             {
  117.                 foreach (var ruleSet in rule.RuleSet)
  118.                 {
  119.                     foreach (var sets in ruleSet)
  120.                     {
  121.                         var input = String.Empty;
  122.                         var f = false;
  123.                         foreach (var set in sets)
  124.                         {
  125.                             input += set;
  126.                         }
  127.  
  128.                         First(sets, new List<string>(), resultList);
  129.  
  130.                         foreach (var resultSet in resultList)
  131.                         {
  132.                             if (resultSet == "\' \'")
  133.                             {
  134.                                 f = true;
  135.                             }
  136.                         }
  137.  
  138.                         foreach (var resultSet in resultList)
  139.                         {
  140.                             for (var i = 1; i < terminals.Count + 1; i++)
  141.                             {
  142.                                 if (resultSet == Table[0, i])
  143.                                 {
  144.                                     //if (s == "\' \'") Table[k, Terminal.Count] = input;
  145.                                     Table[row, i] = input;
  146.                                 }
  147.                             }
  148.                         }
  149.  
  150.                         if (f)
  151.                         {
  152.                             Follow(rule, finalList);
  153.                             foreach (var resultSet in resultList)
  154.                             {
  155.                                 foreach (var finalSet in finalList)
  156.                                 {
  157.                                     if (resultSet == finalSet)
  158.                                     {
  159.                                         finalList.Remove(finalSet);
  160.                                     }
  161.                                 }
  162.                             }
  163.  
  164.                             foreach (var finalSet in finalList)
  165.                             {
  166.                                 for (var i = 1; i < terminals.Count + 1; i++)
  167.                                 {
  168.                                     if (finalSet == Table[0, i])
  169.                                     {
  170.                                         //if (s == "\' \'") Table[k, Terminal.Count] = input;
  171.                                         Table[row, i] = "\' \'";
  172.                                     }
  173.                                 }
  174.                             }
  175.                         }
  176.  
  177.                         resultList = new List<string>();
  178.                         finalList = new List<string>();
  179.                     }
  180.                 }
  181.                 row++;
  182.             }
  183.  
  184.             row = 1;
  185.             foreach (var ruleSet in AllRules)
  186.             {
  187.                 Follow(ruleSet, resultList);
  188.                 foreach (var resultSet in resultList)
  189.                 {
  190.                     for (var i = 1; i < terminals.Count + 1; i++)
  191.                     {
  192.                         if (resultSet == Table[0, i])
  193.                         {
  194.                             if (Table[row, i] == "NULL")
  195.                             {
  196.                                 Table[row, i] = "synch";
  197.                             }
  198.                         }
  199.                     }
  200.                 }
  201.                 resultList = new List<string>();
  202.                 row++;
  203.             }
  204.  
  205.             row = 1;
  206.             foreach (var ruleSet in AllRules)
  207.             {
  208.                 First(ruleSet, new List<string>(), resultList);
  209.                 foreach (var resultSet in resultList)
  210.                 {
  211.                     for (int i = 1; i < terminals.Count + 1; i++)
  212.                     {
  213.                         if (resultSet == Table[0, i])
  214.                         {
  215.                             if (Table[row, i] == "NULL")
  216.                             {
  217.                                 Table[row, i] = "synch";
  218.                             }
  219.                         }
  220.                     }
  221.                 }
  222.                 resultList = new List<string>();
  223.                 row++;
  224.             }
  225.             //EA.Recording(Table, NotTerminal.Count + 1, Terminal.Count + 1);
  226.         }
  227.  
  228.         public static void First(string[] inputRule, List<string> inputList, List<string> ResultList)
  229.         {
  230.             var resultList = inputList;
  231.             var finalResultList = ResultList;
  232.             var result = string.Empty;
  233.             var notEqualsWithInput = true;
  234.             var equalsWithInput = false;
  235.             for (var i = 0; i < inputRule.Length; i++)
  236.             {
  237.                 if (inputRule[i] == "\' \'")
  238.                 {
  239.                     foreach (var resultRule in resultList)
  240.                     {
  241.                         if (resultRule == inputRule[i])
  242.                         {
  243.                             notEqualsWithInput = false;
  244.                             equalsWithInput = true;
  245.                             break;
  246.                         }
  247.                     }
  248.                     if (notEqualsWithInput)
  249.                     {
  250.                         resultList.Add(inputRule[i]);
  251.                         equalsWithInput = true;
  252.                     }
  253.                     break;
  254.                 }
  255.                 if ((inputRule[i][0] == '\'') && (inputRule[i][inputRule[i].Length - 1] == '\''))
  256.                 {
  257.                     foreach (var resultRule in resultList)
  258.                     {
  259.                         if (resultRule == inputRule[i])
  260.                         {
  261.                             notEqualsWithInput = false;
  262.                             equalsWithInput = true;
  263.                             break;
  264.                         }
  265.                     }
  266.                     if (notEqualsWithInput)
  267.                     {
  268.                         resultList.Add(inputRule[i]);
  269.                         equalsWithInput = true;
  270.                     }
  271.                     break;
  272.                 }
  273.                 if ((inputRule[i][0] == '<') && (inputRule[i][inputRule[i].Length - 1] == '>'))
  274.                 {
  275.                     foreach (var rule in AllRules)
  276.                     {
  277.                         if (inputRule[i] == rule.NonTerminal)
  278.                         {
  279.                             First(rule, resultList, finalResultList);
  280.                             equalsWithInput = true;
  281.                             break;
  282.                         }
  283.                     }
  284.                 }
  285.                 if (equalsWithInput)
  286.                 {
  287.                     equalsWithInput = false;
  288.                     break;
  289.                 }
  290.             }
  291.             foreach (var resultSet in resultList)
  292.             {
  293.                 bool setsNotEquals = true;
  294.                 foreach (string finalResultSet in finalResultList)
  295.                 {
  296.                     if (finalResultSet == resultSet)
  297.                     {
  298.                         setsNotEquals = false;
  299.                     }
  300.                 }
  301.                 if (setsNotEquals)
  302.                 {
  303.                     finalResultList.Add(resultSet);
  304.                 }
  305.             }
  306.  
  307.         }
  308.  
  309.         public static void First(RuleModel inputRule, List<string> inputList, List<string> ResultList)
  310.         {
  311.             var resultList = inputList;
  312.             var finalResultList = ResultList;
  313.             var result = string.Empty;
  314.             var notFromResultList = true;
  315.             var fromResultList = false;
  316.             var exitFlag = false;
  317.             foreach (var ruleList in inputRule.RuleSet)
  318.             {
  319.  
  320.                 foreach (var rule in ruleList)
  321.                 {
  322.                     for (var i = 0; i < rule.Length; i++)
  323.                     {
  324.                         exitFlag = true;
  325.                         if (rule[i] == "\' \'")
  326.                         {
  327.                             foreach (var resultSet in resultList)
  328.                             {
  329.                                 if (resultSet == rule[i])
  330.                                 {
  331.                                     notFromResultList = false;
  332.                                     fromResultList = true;
  333.                                     exitFlag = false;
  334.                                     break;
  335.                                 }
  336.                             }
  337.                             if (notFromResultList)
  338.                             {
  339.                                 resultList.Add(rule[i]);
  340.                                 fromResultList = true;
  341.                             }
  342.                             break;
  343.                         }
  344.                         if ((rule[i][0] == '\'') && (rule[i][rule[i].Length - 1] == '\''))
  345.                         {
  346.                             foreach (var resultSet in resultList)
  347.                             {
  348.                                 if (resultSet == rule[i])
  349.                                 {
  350.                                     notFromResultList = false;
  351.                                     fromResultList = true;
  352.                                     break;
  353.                                 }
  354.                             }
  355.                             if (notFromResultList)
  356.                             {
  357.                                 resultList.Add(rule[i]);
  358.                                 fromResultList = true;
  359.                             }
  360.                             break;
  361.                         }
  362.                         if ((rule[i][0] == '<') && (rule[i][rule[i].Length - 1] == '>'))
  363.                         {
  364.                             foreach (var ruleSet in AllRules)
  365.                             {
  366.                                 if (rule[i] == ruleSet.NonTerminal)
  367.                                 {
  368.                                     First(ruleSet, resultList, finalResultList);
  369.                                     fromResultList = true;
  370.                                     break;
  371.                                 }
  372.                             }
  373.                         }
  374.                         if (fromResultList)
  375.                         {
  376.                             fromResultList = false;
  377.                             break;
  378.                         }
  379.                     }
  380.                 }
  381.                 foreach (var resultSet in resultList)
  382.                 {
  383.                     if (resultSet == "\' \'")
  384.                     {
  385.                         exitFlag = false;
  386.                     }
  387.                 }
  388.                 foreach (var resultSet in resultList)
  389.                 {
  390.                     bool setsNotEquals = true;
  391.                     foreach (var finalResultSet in finalResultList)
  392.                     {
  393.                         if (finalResultSet == resultSet)
  394.                         {
  395.                             setsNotEquals = false;
  396.                         }
  397.                     }
  398.                     if (setsNotEquals)
  399.                     {
  400.                         finalResultList.Add(resultSet);
  401.                     }
  402.                 }
  403.                 if (exitFlag)
  404.                 {
  405.                     break;
  406.                 }
  407.             }
  408.         }
  409.  
  410.         public static void Follow(RuleModel inputRule, List<string> inputList)
  411.         {
  412.             //bool glFlag = true;
  413.             var flag = true;
  414.             var resultList = inputList;
  415.             var result = string.Empty;
  416.             foreach (var ruleSets in AllRules)
  417.             {
  418.                 if (ruleSets.NonTerminal == inputRule.NonTerminal)
  419.                 {
  420.                     continue;
  421.                 }
  422.                 foreach (var ruleSet in ruleSets.RuleSet)
  423.                 {
  424.                     foreach (var set in ruleSet)
  425.                     {
  426.                         flag = true;
  427.                         //glFlag = true;
  428.                         for (var i = 0; i < set.Length; i++)
  429.                         {
  430.                             if (set[i] == "\' \'")
  431.                             {
  432.                                 continue;
  433.                                 /*Follow(r, resultList);
  434.                                 glFlag = false;
  435.                                 break;*/
  436.                             }
  437.                             if (set[i] == inputRule.NonTerminal)
  438.                             {
  439.                                 if (i + 1 == set.Length)
  440.                                 {
  441.                                     Follow(ruleSets, resultList);
  442.                                     for (int i1 = 0; i1 < resultList.Count; i1++) if (resultList[i1] == "\' \'") resultList.Remove(resultList[i1]);
  443.                                     break;
  444.                                 }
  445.                                 if (i + 1 != set.Length)
  446.                                 {
  447.                                     for (int k = i + 1; k < set.Length; k++)
  448.                                     {
  449.                                         bool isEmptySymbol = true;
  450.                                         foreach (var anotherRule in AllRules)
  451.                                         {
  452.                                             if (anotherRule.NonTerminal == set[k])
  453.                                             {
  454.                                                 var finalList = new List<string>();
  455.                                                 finalList = resultList;
  456.                                                 First(anotherRule, resultList, finalList);
  457.                                                 resultList = finalList;
  458.                                                 foreach (var resultSet in resultList)
  459.                                                 {
  460.                                                     if (resultSet == "\' \'")
  461.                                                     {
  462.                                                         isEmptySymbol = false;
  463.                                                     }
  464.                                                 }
  465.                                                 foreach (var resultSet in resultList)
  466.                                                 {
  467.                                                     if (resultSet == "\' \'")
  468.                                                     {
  469.                                                         Follow(anotherRule, resultList);
  470.                                                         for (var j = 0; j < resultList.Count; j++) if (resultList[j] == "\' \'") resultList.Remove(resultList[j]);
  471.                                                         break;
  472.                                                     }
  473.                                                 }
  474.                                                 flag = false;
  475.                                                 break;
  476.                                             }
  477.                                         }
  478.  
  479.                                         if (flag)
  480.                                         {
  481.                                             var resultNotEqual = true;
  482.                                             foreach (var resultSet in resultList)
  483.                                             {
  484.                                                 if (resultSet == set[i + 1])
  485.                                                 {
  486.                                                     resultNotEqual = false;
  487.                                                 }
  488.                                             }
  489.                                             if (resultNotEqual)
  490.                                             {
  491.                                                 resultList.Add(set[i + 1]);
  492.                                             }
  493.  
  494.                                             if (set[i + 1] == "\' \'")
  495.                                             {
  496.                                                 isEmptySymbol = true;
  497.                                             }
  498.                                         }
  499.  
  500.                                         if (isEmptySymbol)
  501.                                         {
  502.                                             break;
  503.                                         }
  504.                                     }
  505.                                     //glFlag = false;
  506.                                     break;
  507.                                 }
  508.                             }
  509.  
  510.                         }
  511.                         //if (glFlag) break;
  512.                     }
  513.  
  514.                 }
  515.             }
  516.  
  517.         }
  518.  
  519.         public static void Analyze(List<string> input, List<string> magazine)
  520.         {
  521.             var flagCont = true;
  522.             var symbolNumber = 1;
  523.             var column = 0;
  524.             var row = 0;
  525.             var errorCount = 0;
  526.             var deep = 0;
  527.  
  528.  
  529.             while (input.Count > 0)
  530.             {
  531.                 if ((magazine[0] == "\'$\'") && (input[0] == "\'$\'"))
  532.                 {
  533.                     break;
  534.                 }
  535.  
  536.                 if (magazine[0] == "\'$\'")
  537.                 {
  538.                     errorCount++;
  539.                     Console.WriteLine("Error: MagStack is Empty: " + input[0] + " ( Номер символа: " + symbolNumber + ")");
  540.                     break;
  541.                 }
  542.                 if (input[0] == "\'$\'")
  543.                 {
  544.                     errorCount++;
  545.                     Console.WriteLine("Error: InputStack is Empty: " + magazine[0] + " ( Номер символа: " + symbolNumber + ")");
  546.                     break;
  547.                 }
  548.  
  549.                 if (magazine[0][0] == '<')
  550.                 {
  551.                     column = 0;
  552.                     row = 0;
  553.                     flagCont = true;
  554.                     for (int i = 1; i < AnalyzerModel.RowsCount; i++)
  555.                     {
  556.                         if (input[0] == AnalyzerModel.Table[0, i])
  557.                         {
  558.                             column = i;
  559.                             break;
  560.                         }
  561.                     }
  562.  
  563.                     if (column == 0)
  564.                     {
  565.                         errorCount++;
  566.                         Console.WriteLine("Error:" + input[0] + " ( Номер символа: " + symbolNumber + ")");
  567.                         input.Remove(input[0]);
  568.                         flagCont = false;
  569.                     }
  570.  
  571.                     if (flagCont)
  572.                     {
  573.                         for (int i = 1; i < AnalyzerModel.ColumnsCount; i++)
  574.                         {
  575.                             if (AnalyzerModel.Table[i, 0] == magazine[0])
  576.                             {
  577.                                 row = i;
  578.                                 break;
  579.                             }
  580.                         }
  581.  
  582.                         if ((magazine[0] == "<empty>") && (input[0] != "' '"))
  583.                         {
  584.                             magazine.Remove(magazine[0]);
  585.                             continue;
  586.                         }
  587.  
  588.                         if (AnalyzerModel.Table[row, column] == "NULL")
  589.                         {
  590.                             errorCount++;
  591.                             Console.WriteLine("Error:" + input[0] + " ( Номер символа: " + symbolNumber + "; Ожидался:" + magazine[0] + ")");
  592.                             input.Remove(input[0]);
  593.                             //magStack.Remove(magStack[0]);
  594.                             symbolNumber++;
  595.                             continue;
  596.                         }
  597.  
  598.                         if (AnalyzerModel.Table[row, column] == "synch")
  599.                         {
  600.                             errorCount++;
  601.                             Console.WriteLine("Error:" + input[0] + " ( Номер символа: " + symbolNumber + "; Ожидался:" + magazine[0] + ")");
  602.                             magazine.Remove(magazine[0]);
  603.                             //inputStack.Remove(inputStack[0]);
  604.                             symbolNumber++;
  605.                             continue;
  606.                         }
  607.  
  608.  
  609.  
  610.                         List<string> RuleList = AnalyzerModel.ToList(AnalyzerModel.Table[row, column]);
  611.                         magazine.Remove(magazine[0]);
  612.                         List<string> TimeList = magazine;
  613.                         magazine = new List<string>();
  614.                         foreach (var ruleSet in RuleList)
  615.                         {
  616.                             magazine.Add(ruleSet);
  617.                         }
  618.                         foreach (var ruleSet in TimeList)
  619.                         {
  620.                             magazine.Add(ruleSet);
  621.                         }
  622.                         continue;
  623.                     }
  624.  
  625.                 }
  626.  
  627.                 if (magazine[0][0] == '\'')
  628.                 {
  629.                     if (magazine[0] == input[0])
  630.                     {
  631.                         magazine.Remove(magazine[0]);
  632.                         input.Remove(input[0]);
  633.                         symbolNumber++;
  634.                         continue;
  635.                     }
  636.  
  637.                     errorCount++;
  638.                     Console.WriteLine("Error:" + input[0] + " ( Номер символа: " + symbolNumber + "; Ожидался:" + magazine[0] + ")");
  639.                     input.Remove(input[0]);
  640.                     symbolNumber++;
  641.                     continue;
  642.                 }
  643.  
  644.                 if (deep > 50) break;
  645.                 deep++;
  646.             }
  647.             Console.WriteLine("Errors = " + errorCount);
  648.         }
  649.     }
  650. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement