public void visit(ConcatenationD concatenationD) { if (!found) { foreach (GrammarNodeD node in concatenationD.Children) node.accept(this); } }
public void visit(ConcatenationD concatenationD) { foreach (GrammarNodeD node in concatenationD.Children) { node.accept(this); // if node isn't last node, print operator if (node != concatenationD.Children[concatenationD.Children.Count - 1]) representation.Inlines.Add(new Run(concatenationOperator)); } }
public void AddChoice(GrammarNodeD grammarNodeD) { // assert parent is concatenation ConcatenationD parent = grammarNodeD.Parent as ConcatenationD; if (parent == null) throw new Exception("The grammarNodeD parent is not of type concatenation"); // assert parent parent is choiceD ChoiceD parentParent = parent.Parent as ChoiceD; if (parentParent == null) throw new Exception("The grammarNodeD parent parent is not of type choiceD"); ConcatenationD concatD = new ConcatenationD(parentParent); parentParent.appendChild(concatD); concatD.appendChild(new UndefinedD(concatD)); }
public void visit(ConcatenationD concatenationD) { int i = 0; int position = -1; foreach (GrammarNodeD node in concatenationD.Children) { if (node == target) { position = i + 1; break; } node.accept(this); i++; } if (position > -1) { createItem(concatenationD); concatenationD.insertChild(position, item); } }
private void Init(List<GrammarNodeV> childrenIn, ConcatenationD refIn) { reference = refIn; children = childrenIn; }
public ConcatenationV(List<GrammarNodeV> children, ConcatenationD refIn) { Init(children, refIn); }
public ConcatenationV(ConcatenationD refIn) { Init(new List<GrammarNodeV>(), refIn); }
public void visit(ConcatenationD concatenationD) { List<GrammarNodeV> children = new List<GrammarNodeV>(); foreach (GrammarNodeD child in concatenationD.Children) { // make children child.accept(this); children.Add(current); } ConcatenationV concatenationV = new ConcatenationV(children, concatenationD); concatenationD.AddReference(concatenationV); current = concatenationV; }
/// <summary> /// Returns the rule structure, without the ChoiceLineD /// </summary> /// <param name="productionRuleLexemes"></param> /// <returns></returns> private void CreateRuleDataStructure(List<Lexeme> productionRuleLexemes, ChoiceLineD choiceLineD) { //GrammarNodeD returnVal; OperationD current = choiceLineD; // points to which level we are at //returnVal = current; // Split by Choice as this has the highest precedence List<Lexeme> choiceLexemes = new List<Lexeme>(); ArrayList choices = new ArrayList(); foreach (Lexeme lexeme in productionRuleLexemes) { if (lexeme.Type == LexemeType.Choice) { choices.Add(choiceLexemes); choiceLexemes = new List<Lexeme>(); } else { choiceLexemes.Add(lexeme); } } // add last choice list choices.Add(choiceLexemes); // put in a choiceD ChoiceD choiceD = new ChoiceD(current); current.appendChild(choiceD); current = choiceD; // move down a level // add the concatenated items for each Choice foreach (List<Lexeme> concatLexemes in choices) { ConcatenationD concatenation = new ConcatenationD(current); foreach (Lexeme lexeme in concatLexemes) { if (lexeme.Type == LexemeType.Nonterminal) { // create nonterminal tail from the nonterminalhead NonterminalHeadD nontHead = getNonterminalHead(lexeme.Value); if (nontHead == null) throw new Exception("Could not find a defined rule for the Nonterminal: " + lexeme.Value); NonterminalTailD nontTail = new NonterminalTailD(nontHead, concatenation); // add the tail to current children concatenation.appendChild(nontTail); } else if (lexeme.Type == LexemeType.Terminal) { TerminalD terminalD = new TerminalD(lexeme.Value, concatenation); concatenation.appendChild(terminalD); } else if (lexeme.Type == LexemeType.Undefined) { UndefinedD undefinedD = new UndefinedD(concatenation); concatenation.appendChild(undefinedD); } else if (lexeme.Type != LexemeType.Concatenation) { // Lexes should only be of type Nont, T and Concat. Error throw new Exception("Lexeme was not of type Nonterminal, Terminal or Concatenation"); } } current.appendChild(concatenation); } }
/// <summary> /// Creates a new nonterminal and add's it to the defintive grammar. /// It's rule is a simple Nont -> ChoiceLineD -> ConcatD -> Undefined /// </summary> /// <param name="name"></param> public NonterminalHeadD CreateNewNonterminal(String name) { if (model.DefinitiveGrammar.getNonterminal(name) != null) throw new Exception("The given name already exists as a nonterminal, dummy"); // build nonterminal NonterminalHeadD newNonterminal = new NonterminalHeadD(name); ChoiceLineD choiceLineD = new ChoiceLineD(newNonterminal); newNonterminal.Rule = choiceLineD; ChoiceD choiceD = new ChoiceD(choiceLineD); newNonterminal.Rule.appendChild(choiceD); ConcatenationD concatD = new ConcatenationD(choiceD); choiceD.appendChild(concatD); concatD.appendChild(new UndefinedD(concatD)); // add to model model.DefinitiveGrammar.Nonterminals.Add(newNonterminal); return newNonterminal; }
public void Delete(GrammarNodeD grammarNodeD) { if (grammarNodeD.Parent is ConcatenationD) { ConcatenationD parent = grammarNodeD.Parent as ConcatenationD; // do the removal grammarNodeD.Dispose(); parent.Children.Remove(grammarNodeD); if (parent.Children.Count == 0) // add undefined parent.appendChild(new UndefinedD(parent)); } else if (grammarNodeD.Parent is ChoiceD) { // removing a choice ChoiceD parent = grammarNodeD.Parent as ChoiceD; // do removal grammarNodeD.Dispose(); parent.Children.Remove(grammarNodeD); if (parent.Children.Count == 0) { ConcatenationD concatD = new ConcatenationD(parent); parent.appendChild(concatD); concatD.appendChild(new UndefinedD(concatD)); } } else throw new Exception("The parent was not of type concatenation, I don't know what to do..."); }
public void Delete(ConcatenationD concatD) { GrammarNodeVDeleteVisitor visitor = new GrammarNodeVDeleteVisitor(concatD); startSymbol.accept(visitor); }