实现构造GOTO表和ACTION表的函数如BuildGotoTable和BuildActionTable函数。 private DictionaryTupleint Symbol int gotoTable = new DictionaryTupleint Symbol int; private DictionaryTupleint Symbol string acti
-
实现LR分析器的核心函数,如LRParser()函数。
public bool LRParser(string input) { Stack<int> stateStack = new Stack<int>(); Stack<Symbol> symbolStack = new Stack<Symbol>(); Stack<char> inputStack = new Stack<char>(); stateStack.Push(0); inputStack.Push('$'); for (int i = input.Length - 1; i >= 0; i--) { inputStack.Push(input[i]); } while (true) { int state = stateStack.Peek(); char inputChar = inputStack.Peek(); Symbol symbol = symbolStack.Count > 0 ? symbolStack.Peek() : null; if (actionTable.ContainsKey(new Tuple<int, Symbol>(state, new Symbol(inputChar, true)))) { string action = actionTable[new Tuple<int, Symbol>(state, new Symbol(inputChar, true))]; if (action.StartsWith("s")) { int nextState = int.Parse(action.Substring(1)); stateStack.Push(nextState); symbolStack.Push(new Symbol(inputChar, true)); inputStack.Pop(); } else if (action.StartsWith("r")) { int productionIndex = int.Parse(action.Substring(1)); Production production = productions[productionIndex]; for (int i = 0; i < production.Right.Count; i++) { stateStack.Pop(); symbolStack.Pop(); } int prevState = stateStack.Peek(); Symbol prevSymbol = symbolStack.Count > 0 ? symbolStack.Peek() : null; int nextState = gotoTable[new Tuple<int, Symbol>(prevState, production.Left)]; stateStack.Push(nextState); symbolStack.Push(production.LeftSymbol); } else if (action == "acc") { return true; } } else { return false; } } } -
定义状态栈、符号栈和输入栈的数据结构,如Stack
、Stack 和Stack 。 private Stack<int> stateStack = new Stack<int>(); private Stack<Symbol> symbolStack = new Stack<Symbol>(); private Stack<char> inputStack = new Stack<char>(); -
实现分析句子的函数,如Parse()函数。
public bool Parse(string input) { stateStack.Clear(); symbolStack.Clear(); inputStack.Clear(); stateStack.Push(0); inputStack.Push('$'); for (int i = input.Length - 1; i >= 0; i--) { inputStack.Push(input[i]); } while (true) { int state = stateStack.Peek(); char inputChar = inputStack.Peek(); Symbol symbol = symbolStack.Count > 0 ? symbolStack.Peek() : null; if (actionTable.ContainsKey(new Tuple<int, Symbol>(state, new Symbol(inputChar, true)))) { string action = actionTable[new Tuple<int, Symbol>(state, new Symbol(inputChar, true))]; if (action.StartsWith("s")) { int nextState = int.Parse(action.Substring(1)); stateStack.Push(nextState); symbolStack.Push(new Symbol(inputChar, true)); inputStack.Pop(); } else if (action.StartsWith("r")) { int productionIndex = int.Parse(action.Substring(1)); Production production = productions[productionIndex]; for (int i = 0; i < production.Right.Count; i++) { stateStack.Pop(); symbolStack.Pop(); } int prevState = stateStack.Peek(); Symbol prevSymbol = symbolStack.Count > 0 ? symbolStack.Peek() : null; int nextState = gotoTable[new Tuple<int, Symbol>(prevState, production.Left)]; stateStack.Push(nextState); symbolStack.Push(production.LeftSymbol); } else if (action == "acc") { return true; } } else { return false; } } } -
实现单步分析和一键分析的函数,如StepByStepParse()和OneKeyParse()函数。
public bool StepByStepParse(string input) { int state = stateStack.Peek(); char inputChar = inputStack.Peek(); Symbol symbol = symbolStack.Count > 0 ? symbolStack.Peek() : null; if (actionTable.ContainsKey(new Tuple<int, Symbol>(state, new Symbol(inputChar, true)))) { string action = actionTable[new Tuple<int, Symbol>(state, new Symbol(inputChar, true))]; if (action.StartsWith("s")) { int nextState = int.Parse(action.Substring(1)); stateStack.Push(nextState); symbolStack.Push(new Symbol(inputChar, true)); inputStack.Pop(); } else if (action.StartsWith("r")) { int productionIndex = int.Parse(action.Substring(1)); Production production = productions[productionIndex]; for (int i = 0; i < production.Right.Count; i++) { stateStack.Pop(); symbolStack.Pop(); } int prevState = stateStack.Peek(); Symbol prevSymbol = symbolStack.Count > 0 ? symbolStack.Peek() : null; int nextState = gotoTable[new Tuple<int, Symbol>(prevState, production.Left)]; stateStack.Push(nextState); symbolStack.Push(production.LeftSymbol); } else if (action == "acc") { return true; } return false; } else { return false; } } public bool OneKeyParse(string input) { while (true) { int state = stateStack.Peek(); char inputChar = inputStack.Peek(); Symbol symbol = symbolStack.Count > 0 ? symbolStack.Peek() : null; if (actionTable.ContainsKey(new Tuple<int, Symbol>(state, new Symbol(inputChar, true)))) { string action = actionTable[new Tuple<int, Symbol>(state, new Symbol(inputChar, true))]; if (action.StartsWith("s")) { int nextState = int.Parse(action.Substring(1)); stateStack.Push(nextState); symbolStack.Push(new Symbol(inputChar, true)); inputStack.Pop(); } else if (action.StartsWith("r")) { int productionIndex = int.Parse(action.Substring(1)); Production production = productions[productionIndex]; for (int i = 0; i < production.Right.Count; i++) { stateStack.Pop(); symbolStack.Pop(); } int prevState = stateStack.Peek(); Symbol prevSymbol = symbolStack.Count > 0 ? symbolStack.Peek() : null; int nextState = gotoTable[new Tuple<int, Symbol>(prevState, production.Left)]; stateStack.Push(nextState); symbolStack.Push(production.LeftSymbol); } else if (action == "acc") { return true; } } else { return false; } } } -
实现界面的交互逻辑,如按钮的点击事件处理函数。
示例代码略
原文地址: https://www.cveoy.top/t/topic/hfdI 著作权归作者所有。请勿转载和采集!