//static public string TIKZEDT_CMD_COMMENT = ""; public static Tikz_ParseTree ParseInputFile(string code) { //if code is empty to bother ANTLR (it will raise an exception) if (code.Trim() == "") return null; simpletikzLexer lex = new simpletikzLexer(new ANTLRStringStream(code)); CommonTokenStream tokens = new CommonTokenStream(lex); simpletikzParser parser = new simpletikzParser(tokens); simpletikzParser.tikzdocument_wo_tikzpicture_return ret = parser.tikzdocument_wo_tikzpicture(); CommonTree t = (CommonTree)ret.Tree; Tikz_ParseTree root = new Tikz_ParseTree(); bool success = FillItem(root, t, tokens); if (success) { root.RegisterNodeAndStyleRefs(); // make a list with all node names for later reference return root; } else return null; }
protected bool EnsureParseTreeExists() { // Try to create a new ParseTree if (overlay.ParseTree == null) { // TODO return false; //TryCreateNew(this, out lret); if (overlay.AllowEditing) { // create a new parsetree Tikz_ParseTree t = new Tikz_ParseTree(); Tikz_Picture tp = new Tikz_Picture(); tp.starttag = "\\begin{tikzpicture}"; tp.AddChild(new Tikz_Something("\r\n")); tp.endtag = "\\end{tikzpicture}"; overlay.BeginUpdate(); // overlay.ParseTree = t; t.AddChild(tp); tp.UpdateText(); overlay.EndUpdate(); return true; } else { GlobalUI.UI.ShowMessageBox("Parse tree could not be created. Please correct all parser errors in the code and try again.", "Function not available", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return false; } } else return true; }
public static Tikz_ParseTree Parse(string code) { code = PrepareCodeForParsing(code); //if code is empty to bother ANTLR (it will raise an exception) if (code.Trim() == "") return null; simpletikzLexer lex = new simpletikzLexer(new ANTLRStringStream(code)); CommonTokenStream tokens = new CommonTokenStream(lex); //for (int i = 0; i < tokens.Count; i++) //{ // string ds = tokens.Get(i).Text; // ds = ds + "eee"; //} simpletikzParser parser = new simpletikzParser(tokens); //tikzgrammarParser.expr_return r = simpletikzParser.tikzdocument_return ret = parser.tikzdocument(); //CommonTreeAdaptor adaptor = new CommonTreeAdaptor(); CommonTree t = (CommonTree)ret.Tree; //MessageBox.Show(printTree(t,0)); /* public string printTree(CommonTree t, int indent) { string s=""; if ( t != null ) { for ( int i = 0; i < indent; i++ ) s = s+" "; string r = "";// s + t.ToString() + "\r\n"; if (t.ChildCount >0) foreach ( object o in t.Children ) { r=r+s+o.ToString()+"\r\n" + printTree((CommonTree)o, indent+1); } return r; } else return ""; } }*/ Tikz_ParseTree root = new Tikz_ParseTree(); bool success = FillItem(root, t, tokens); // mockup //t.Children.Add(new Tikz_Node(0, 0)); //t.Children.Add(new Tikz_Node(5, 5)); //t.Children.Add(new Tikz_Node(6, 8)); //t.Children.Add(new Tikz_Node(8, 8)); if (success) { root.RegisterNodeAndStyleRefs(); // make a list with all node names for later reference return root; } else return null; }
/// <summary> /// Tries to find a BOUNDINGBOX command in the parsetree specified. /// </summary> /// <param name="t">The parsetree in which to search for BOUNDINGBOX commands.</param> /// <param name="BB">Contains the BB found after return.</param> /// <returns>Returns true if a valid BOUNDINGBOX command is found, false otherwise.</returns> bool ParseForBBCommand(Tikz_ParseTree t, out Rect BB) { // run through all commands in parsetree (only top level) BB = new Rect(Properties.Settings.Default.BB_Std_X, Properties.Settings.Default.BB_Std_Y, Properties.Settings.Default.BB_Std_W, Properties.Settings.Default.BB_Std_H); RegexOptions ro = new RegexOptions(); ro = ro | RegexOptions.IgnoreCase; ro = ro | RegexOptions.Multiline; //string BB_RegexString = @".*BOUNDINGBOX[ \t\s]*=[ \t\s]*(?<left>[+-]?[0-9]+[.[0-9]+]?)+[ \t\s]+(?<bottom>[0-9])+[ \t\s]+(?<right>[0-9])+[ \t\s]+(?<top>[0-9])+[ \t\s]+.*"; //string BB_RegexString = @".*BOUNDINGBOX[ \t\s]*=[ \t\s]*((?<left>[+-]?[0-9]+(\.[0-9]+)?)[ \t\s]*){4}.*"; string BB_RegexString = @".*BOUNDINGBOX[ \t\s]*=[ \t\s]*(?<left>[+-]?[0-9]+(\.[0-9]+)?)+[ \t\s]+(?<bottom>[+-]?[0-9]+(\.[0-9]+)?)+[ \t\s]+(?<width>[+-]?[0-9]+(\.[0-9]+)?)+[ \t\s]+(?<height>[+-]?[0-9]+(\.[0-9]+)?)+[ \t\s]+.*"; Regex BB_Regex = new Regex(BB_RegexString, ro); foreach (TikzParseItem tpi in t.Children) { if (tpi is Tikz_EdtCommand) { Match m = BB_Regex.Match(tpi.text); if (m.Success == true) { try { double x = Convert.ToDouble(m.Groups[5].Value); double y = Convert.ToDouble(m.Groups[6].Value); double width = Convert.ToDouble(m.Groups[7].Value); double height = Convert.ToDouble(m.Groups[8].Value); Rect newBB = new Rect(x, y, width, height); //chkAutoBB.IsChecked = true; //chkAutoBB.IsEnabled = false; //txtBB.ToolTip = "Managed by source code"; if (width > 0 && height > 0) { BB = newBB; return true; } } catch (Exception) { /*width or height negative. ignore. */} } } } // else // { // chkAutoBB.IsEnabled = true; // txtBB.ToolTip = ""; // DetermineBB(t); // } // } return false; //try //{ // Tikz_ParseTree t = TikzParser.Parse(txtCode.Text); // if (t == null) return; ////SourceManager.Parse(txtCode.Text); //Regex //TikzParser.TIKZEDT_CMD_COMMENT //UpdateStyleLists(t); // Refresh overlay //pdfOverlay1.SetParseTree(t, currentBB); //} //catch (Exception e) //{ // AddStatusLine("Couldn't parse code. " + e.Message, true); // pdfOverlay1.SetParseTree(null, currentBB); //} }
/// <summary> /// Determines the current Bounding Box. /// Priorities are as follows: /// 1. If Auto unchecked, take manually specified BB /// 2. Otherwise, if TikzEdt Command BOUNDINGBOX present in t, then takes this BB. /// 3. Otherwise, determine BB automatically. /// 4. If this is impossible, leave the BB unchanged. /// </summary> /// <param name="t">The Parsetree used to determine the BB.</param> /// <returns>True if BB changed, false if same.</returns> /* bool DetermineBB(Tikz_ParseTree t) { // not needed anymore Rect newBB = new Rect(Properties.Settings.Default.BB_Std_X, Properties.Settings.Default.BB_Std_Y, Properties.Settings.Default.BB_Std_W, Properties.Settings.Default.BB_Std_H); //Rect newBB2; bool lret = false; if (chkAutoBB.IsChecked == false) { // Parse double d; if (Double.TryParse(txtBBX.Text, out d)) if (d>-100 && d<100) newBB.X=d; if (Double.TryParse(txtBBY.Text, out d)) if (d>-100 && d<100) newBB.Y=d; if (Double.TryParse(txtBBW.Text, out d)) if (d>0 && d<100) newBB.Width=d; if (Double.TryParse(txtBBH.Text, out d)) if (d>0 && d<100) newBB.Height=d; lret = (currentBB != newBB); currentBB = newBB; } else { if (t != null) { if (ParseForBBCommand(t, out newBB)) { // BOUNDINGBOX command in code found //txtBB.ToolTip = ""; //chkAutoBB.IsEnabled = false; //txtBB.ToolTip = "BB determined in source code by BOUNDINGBOX command"; lret = (currentBB != newBB); currentBB = newBB; } else if (t.GetBB(out newBB)) { newBB.Inflate(Properties.Settings.Default.BB_Margin, Properties.Settings.Default.BB_Margin); lret = (currentBB != newBB); currentBB = newBB; } } } return lret; }*/ /// <summary> /// Fills the currently displayed lists of styles from the parsetree provided /// </summary> /// <param name="t">The parse tree to extract the styles from</param> private void UpdateStyleLists(Tikz_ParseTree t) { if (t == null) return; string oldsel = cmbNodeStyles.Text; cmbNodeStyles.Items.Clear(); foreach (string s in t.styles.Keys) { cmbNodeStyles.Items.Add(s); } cmbNodeStyles.Text = oldsel; oldsel = cmbEdgeStyles.Text; cmbEdgeStyles.Items.Clear(); foreach (string s in t.styles.Keys) { cmbEdgeStyles.Items.Add(s); } cmbEdgeStyles.Text = oldsel; }