diff --git a/fa/LexDocument.cs b/fa/LexDocument.cs index 6fd9667..9b21e45 100644 --- a/fa/LexDocument.cs +++ b/fa/LexDocument.cs @@ -130,7 +130,7 @@ public CharFA ToLexer(IProgress progress=null) } return result as CharFA; } - public IEnumerable ToTokenizer(IEnumerable input, IEnumerable symbols = null,IProgress progress=null) + public ITokenizer ToTokenizer(IEnumerable input, IEnumerable symbols = null,IProgress progress=null) { var lexer = ToLexer(progress); var ii = 0; diff --git a/lalr1/Lalr1.cs b/lalr1/Lalr1.cs index d7cdbc9..6f6dded 100644 --- a/lalr1/Lalr1.cs +++ b/lalr1/Lalr1.cs @@ -8,14 +8,14 @@ namespace Pck using Lrfa = FA>; public static class Lalr1 { - public static Lalr1Parser ToLalr1Parser(this CfgDocument cfg,IEnumerable tokenizer,IProgress progress=null) + public static Lalr1Parser ToLalr1Parser(this CfgDocument cfg,ITokenizer tokenizer,IProgress progress=null) { Lalr1Parser parser; var res = TryToLalr1Parser(cfg, out parser,tokenizer,progress); CfgException.ThrowIfErrors(res); return parser; } - public static IList TryToLalr1Parser(this CfgDocument cfg, out Lalr1Parser parser,IEnumerable tokenizer = null,IProgress progress=null) + public static IList TryToLalr1Parser(this CfgDocument cfg, out Lalr1Parser parser,ITokenizer tokenizer = null,IProgress progress=null) { CfgLalr1ParseTable parseTable; var result = TryToLalr1ParseTable(cfg, progress, out parseTable); diff --git a/lalr1/Lalr1DebugParser.cs b/lalr1/Lalr1DebugParser.cs index 06ac332..1181957 100644 --- a/lalr1/Lalr1DebugParser.cs +++ b/lalr1/Lalr1DebugParser.cs @@ -10,6 +10,7 @@ public class Lalr1DebugParser : Lalr1Parser CfgLalr1ParseTable _parseTable; Token _token; Token _errorToken; + ITokenizer _tokenizer; IEnumerator _tokenEnum; HashSet _hidden; HashSet _collapsed; @@ -18,12 +19,14 @@ public class Lalr1DebugParser : Lalr1Parser LRNodeType _nodeType; Stack _stack; string[] _ruleDef; - public Lalr1DebugParser(CfgDocument cfg, IEnumerable tokenizer, CfgLalr1ParseTable parseTable = null) + public Lalr1DebugParser(CfgDocument cfg, ITokenizer tokenizer, CfgLalr1ParseTable parseTable = null) { _cfg = cfg; _PopulateAttrs(); _stack = new Stack(); - _tokenEnum = tokenizer.GetEnumerator(); + _tokenizer = tokenizer; + if(null!=tokenizer) + _tokenEnum = tokenizer.GetEnumerator(); _parseTable = parseTable ?? cfg.ToLalr1ParseTable(); _nodeType = LRNodeType.Initial; } @@ -288,11 +291,22 @@ public override void Restart() _stack.Clear(); _nodeType = LRNodeType.Initial; } - public override void Restart(IEnumerable tokenizer) + public override void Restart(ITokenizer tokenizer) { Close(); + _tokenizer = null; if (null != tokenizer) + { + _tokenizer = tokenizer; _tokenEnum = tokenizer.GetEnumerator(); + } + _nodeType = LRNodeType.Initial; + } + public override void Restart(IEnumerable input) + { + Close(); + _tokenizer.Restart(input); + _tokenEnum = _tokenizer.GetEnumerator(); } void _Panic() { diff --git a/ll1/LL1.cs b/ll1/LL1.cs index 04e89f1..b4ba2c0 100644 --- a/ll1/LL1.cs +++ b/ll1/LL1.cs @@ -6,14 +6,14 @@ namespace Pck { public static class LL1 { - public static LL1Parser ToLL1Parser(this CfgDocument cfg, IEnumerable tokenizer = null, IProgress progress = null) + public static LL1Parser ToLL1Parser(this CfgDocument cfg, ITokenizer tokenizer = null, IProgress progress = null) { LL1Parser parser; var res = TryToLL1Parser(cfg, out parser, tokenizer, progress); CfgException.ThrowIfErrors(res); return parser; } - public static IList TryToLL1Parser(this CfgDocument cfg,out LL1Parser parser,IEnumerable tokenizer = null,IProgress progress=null) + public static IList TryToLL1Parser(this CfgDocument cfg,out LL1Parser parser,ITokenizer tokenizer = null,IProgress progress=null) { CfgLL1ParseTable parseTable; var result = cfg.TryToLL1ParseTable(progress,out parseTable); diff --git a/ll1/LL1DebugParser.cs b/ll1/LL1DebugParser.cs index aff03a2..03ad559 100644 --- a/ll1/LL1DebugParser.cs +++ b/ll1/LL1DebugParser.cs @@ -13,6 +13,7 @@ public class LL1DebugParser : LL1Parser { CfgDocument _cfg; CfgLL1ParseTable _parseTable; + ITokenizer _tokenizer; IEnumerator _tokenEnum; Token _errorToken; Stack _stack; @@ -49,11 +50,21 @@ public override LLNodeType NodeType { return LLNodeType.Initial; } } - public override void Restart(IEnumerable tokenizer) + public override void Restart(ITokenizer tokenizer) { Close(); + _tokenizer = null; if (null != tokenizer) + { + _tokenizer = tokenizer; _tokenEnum = tokenizer.GetEnumerator(); + } + } + public override void Restart(IEnumerable input) + { + Close(); + _tokenizer.Restart(input); + _tokenEnum = _tokenizer.GetEnumerator(); } public override void Restart() { @@ -137,7 +148,7 @@ public override string Value { /// The tokenizer to use /// The start symbol public LL1DebugParser(CfgDocument cfg, - IEnumerable tokenizer) + ITokenizer tokenizer) { _cfg = cfg; _PopulateAttrs(); diff --git a/pck/ITokenizer.cs b/pck/ITokenizer.cs new file mode 100644 index 0000000..981e30c --- /dev/null +++ b/pck/ITokenizer.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Pck +{ + public interface ITokenizer : IEnumerable + { + void Restart(IEnumerable input); + + } +} diff --git a/pck/LL1Parser.cs b/pck/LL1Parser.cs index e639f6c..b3c68e5 100644 --- a/pck/LL1Parser.cs +++ b/pck/LL1Parser.cs @@ -18,7 +18,8 @@ public abstract class LL1Parser : IDisposable public abstract long Position { get; } public abstract bool Read(); public abstract void Restart(); - public abstract void Restart(IEnumerable tokenizer); + public abstract void Restart(ITokenizer tokenizer); + public abstract void Restart(IEnumerable input); public abstract void Close(); public abstract bool IsHidden { get; } public abstract bool IsCollapsed { get; } diff --git a/pck/LL1TableParser.cs b/pck/LL1TableParser.cs index 2d91cfc..c2cbfbc 100644 --- a/pck/LL1TableParser.cs +++ b/pck/LL1TableParser.cs @@ -12,6 +12,7 @@ namespace Pck public class LL1TableParser : LL1Parser { int[][][] _parseTable; + ITokenizer _tokenizer; IEnumerator _tokenEnum; Token _errorToken; Stack _stack; @@ -35,7 +36,7 @@ public override int SubstituteId { } public override KeyValuePair[] GetAttributeSet(int symbolId) { - if (0 < symbolId || _attributeSets.Length <= symbolId) + if (0 > symbolId || _attributeSets.Length <= symbolId) return null; return _attributeSets[symbolId]; } @@ -82,11 +83,21 @@ public override LLNodeType NodeType { return LLNodeType.Initial; } } - public override void Restart(IEnumerable tokenizer) + public override void Restart(ITokenizer tokenizer) { Close(); - if(null!=tokenizer) + _tokenizer = null; + if (null != tokenizer) + { + _tokenizer = tokenizer; _tokenEnum = tokenizer.GetEnumerator(); + } + } + public override void Restart(IEnumerable input) + { + Close(); + _tokenizer.Restart(input); + _tokenEnum = _tokenizer.GetEnumerator(); } public override void Restart() { @@ -161,7 +172,7 @@ public LL1TableParser( int[] nodeFlags, int[] substitutions, KeyValuePair[][] attributeSets, - IEnumerable tokenizer) + ITokenizer tokenizer) { _parseTable = parseTable; _initCfg = initCfg; diff --git a/pck/Lalr1Parser.cs b/pck/Lalr1Parser.cs index 2c24ec4..8191c66 100644 --- a/pck/Lalr1Parser.cs +++ b/pck/Lalr1Parser.cs @@ -30,7 +30,8 @@ public string Rule { public abstract KeyValuePair[] GetAttributeSet(int symbolId); public abstract object GetAttribute(string name, object @default = null); public abstract bool Read(); - public abstract void Restart(IEnumerable tokenizer); + public abstract void Restart(ITokenizer tokenizer); + public abstract void Restart(IEnumerable input); public abstract void Restart(); public abstract void Close(); void IDisposable.Dispose() diff --git a/pck/Lalr1TableParser.cs b/pck/Lalr1TableParser.cs index 0e74e6b..0ba4dfa 100644 --- a/pck/Lalr1TableParser.cs +++ b/pck/Lalr1TableParser.cs @@ -12,6 +12,7 @@ public class Lalr1TableParser : Lalr1Parser string[] _symbols; int[] _nodeFlags; int[] _substitutions; + ITokenizer _tokenizer; IEnumerator _tokenEnum; LRNodeType _nodeType; Stack _stack; @@ -20,7 +21,7 @@ public class Lalr1TableParser : Lalr1Parser int _errorId; KeyValuePair[][] _attributeSets; - public Lalr1TableParser(int[][][] parseTable, string[] symbols,int[] nodeFlags, int[] substitutions,KeyValuePair[][] attributeSets,IEnumerable tokenizer) + public Lalr1TableParser(int[][][] parseTable, string[] symbols,int[] nodeFlags, int[] substitutions,KeyValuePair[][] attributeSets,ITokenizer tokenizer) { _parseTable = parseTable; _symbols = symbols; @@ -34,7 +35,9 @@ public Lalr1TableParser(int[][][] parseTable, string[] symbols,int[] nodeFlags, throw new ArgumentException("Error in symbol table", "symbols"); _stack = new Stack(); - _tokenEnum = tokenizer.GetEnumerator(); + _tokenizer = tokenizer; + if(null!=tokenizer) + _tokenEnum = tokenizer.GetEnumerator(); _nodeType = LRNodeType.Initial; } @@ -174,7 +177,7 @@ public override bool Read() _nodeType = LRNodeType.EndDocument; return true; } - else if (LRNodeType.EndDocument == _nodeType) + else if (LRNodeType.EndDocument == _nodeType || (LRNodeType.Error==_nodeType&&0==_stack.Count)) return false; else if (_eosId == _tokenEnum.Current.SymbolId && LRNodeType.Error == _nodeType) return false; @@ -193,58 +196,65 @@ public override bool Read() return true; } } - var entry = _parseTable[_stack.Peek()]; - //(int RuleOrStateId, int Left, int[] Right) trns; - if(_errorId==_tokenEnum.Current.SymbolId) - { - _Panic(); - return true; - } - int[] trns = entry[_tokenEnum.Current.SymbolId]; - if (null==trns) - { - _Panic(); - return true; - } - if (1== trns.Length) // shift or accept + if (0 < _stack.Count) { - if (-1 != trns[0]) // shift + var entry = _parseTable[_stack.Peek()]; + //(int RuleOrStateId, int Left, int[] Right) trns; + if (_errorId == _tokenEnum.Current.SymbolId) { - _nodeType = LRNodeType.Shift; - _token = _tokenEnum.Current; - _tokenEnum.MoveNext(); - _stack.Push(trns[0]); + _Panic(); return true; } - else - { // accept - //throw if _tok is not $ (end) - if (_eosId!= _tokenEnum.Current.SymbolId) + int[] trns = entry[_tokenEnum.Current.SymbolId]; + if (null == trns) + { + _Panic(); + return true; + } + if (1 == trns.Length) // shift or accept + { + if (-1 != trns[0]) // shift { - _Panic(); + _nodeType = LRNodeType.Shift; + _token = _tokenEnum.Current; + _tokenEnum.MoveNext(); + _stack.Push(trns[0]); return true; } + else + { // accept + //throw if _tok is not $ (end) + if (_eosId != _tokenEnum.Current.SymbolId) + { + _Panic(); + return true; + } - _nodeType = LRNodeType.Accept; - _stack.Clear(); + _nodeType = LRNodeType.Accept; + _stack.Clear(); + return true; + } + } + else // reduce + { + _ruleDef = new int[trns.Length - 1]; + for (var i = 1; i < trns.Length; i++) + _ruleDef[i - 1] = trns[i]; + for (int i = 2; i < trns.Length; ++i) + _stack.Pop(); + + // There is a new number at the top of the stack. + // This number is our temporary state. Get the symbol + // from the left-hand side of the rule #. Treat it as + // the next input token in the GOTO table (and place + // the matching state at the top of the set stack). + _stack.Push(_parseTable[_stack.Peek()][trns[1]][0]); + _nodeType = LRNodeType.Reduce; return true; } - } - else // reduce + } else { - _ruleDef = new int[trns.Length - 1]; - for(var i=1;i tokenizer) + public override void Restart(ITokenizer tokenizer) { Close(); + _tokenizer = null; if (null != tokenizer) + { + _tokenizer = tokenizer; _tokenEnum = tokenizer.GetEnumerator(); + } + } + public override void Restart(IEnumerable input) + { + Close(); + _tokenizer.Restart(input); + _tokenEnum = _tokenizer.GetEnumerator(); } void _Panic() { // This is primitive. Should see if the Dragon Book has something better _nodeType = LRNodeType.Error; - var state = _stack.Peek(); - var d = _parseTable[state]; int[] e; _errorToken.Symbol = "#ERROR"; _errorToken.SymbolId = _errorId; @@ -285,6 +303,10 @@ void _Panic() _errorToken.Column = _tokenEnum.Current.Column; _errorToken.Position = _tokenEnum.Current.Position; var s = _tokenEnum.Current.SymbolId; + if (0 == _stack.Count) + return; + var state = _stack.Peek(); + var d = _parseTable[state]; if (_errorId!=s && null!=(e=d[s]) && _eosId != s) { _errorToken.Value += _tokenEnum.Current.Value; diff --git a/pck/TableTokenizer.cs b/pck/TableTokenizer.cs index da23bd0..676262f 100644 --- a/pck/TableTokenizer.cs +++ b/pck/TableTokenizer.cs @@ -6,7 +6,7 @@ namespace Pck { using CharDfaEntry = KeyValuePair[]>; - public class TableTokenizer : IEnumerable + public class TableTokenizer : ITokenizer { CharDfaEntry[] _dfaTable; int _eosSymbol; @@ -42,6 +42,11 @@ public IEnumerator GetEnumerator() return new _TokenEnumerator(_dfaTable,_errorSymbol,_eosSymbol, _symbols,_blockEnds, _input); } + public void Restart(IEnumerable input) + { + _input = input; + } + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); @@ -73,7 +78,8 @@ internal _TokenEnumerator(CharDfaEntry[] dfaTable, int errorSymbol,int eosSymbol _eosSymbol = eosSymbol; _symbols = symbols; _blockEnds = blockEnds; - _input = @string.GetEnumerator(); + if(null!=@string) + _input = @string.GetEnumerator(); _buffer = new StringBuilder(); _state = -1; _line = 1; @@ -86,7 +92,11 @@ internal _TokenEnumerator(CharDfaEntry[] dfaTable, int errorSymbol,int eosSymbol public void Dispose() { _state = -3; - _input.Dispose(); + if (null != _input) + { + _input.Dispose(); + _input = null; + } } public bool MoveNext() { diff --git a/pckedit/Main.Designer.cs b/pckedit/Main.Designer.cs index c2a2dc6..a7bb976 100644 --- a/pckedit/Main.Designer.cs +++ b/pckedit/Main.Designer.cs @@ -82,8 +82,8 @@ private void InitializeComponent() this.menuSetFont = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); this.codeLanguageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.cToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.vBToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.csToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.vbToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); this.fileTabs = new System.Windows.Forms.TabControl(); this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); @@ -363,49 +363,49 @@ private void InitializeComponent() // createLL1ParserToolStripMenuItem // this.createLL1ParserToolStripMenuItem.Name = "createLL1ParserToolStripMenuItem"; - this.createLL1ParserToolStripMenuItem.Size = new System.Drawing.Size(213, 26); + this.createLL1ParserToolStripMenuItem.Size = new System.Drawing.Size(216, 26); this.createLL1ParserToolStripMenuItem.Text = "&LL(1) Parser"; - this.createLL1ParserToolStripMenuItem.Click += new System.EventHandler(this.createLL1ParserToolStripMenuItem_Click); + this.createLL1ParserToolStripMenuItem.Click += new System.EventHandler(this._HandleCreateLL1Parser); // // createLalr1ParserToolStripMenuItem // this.createLalr1ParserToolStripMenuItem.Name = "createLalr1ParserToolStripMenuItem"; - this.createLalr1ParserToolStripMenuItem.Size = new System.Drawing.Size(213, 26); + this.createLalr1ParserToolStripMenuItem.Size = new System.Drawing.Size(216, 26); this.createLalr1ParserToolStripMenuItem.Text = "Lal&r(1) Parser"; - this.createLalr1ParserToolStripMenuItem.Click += new System.EventHandler(this.createLalr1ParserToolStripMenuItem_Click); + this.createLalr1ParserToolStripMenuItem.Click += new System.EventHandler(this._HandleCreateLalr1ParserClass); // // createFATokenizerToolStripMenuItem // this.createFATokenizerToolStripMenuItem.Name = "createFATokenizerToolStripMenuItem"; - this.createFATokenizerToolStripMenuItem.Size = new System.Drawing.Size(213, 26); + this.createFATokenizerToolStripMenuItem.Size = new System.Drawing.Size(216, 26); this.createFATokenizerToolStripMenuItem.Text = "FA &Tokenizer"; - this.createFATokenizerToolStripMenuItem.Click += new System.EventHandler(this.createFATokenizerToolStripMenuItem_Click); + this.createFATokenizerToolStripMenuItem.Click += new System.EventHandler(this._HandleCreateTokenizerClass); // // fATokenizerLL1ToolStripMenuItem // this.fATokenizerLL1ToolStripMenuItem.Name = "fATokenizerLL1ToolStripMenuItem"; - this.fATokenizerLL1ToolStripMenuItem.Size = new System.Drawing.Size(213, 26); + this.fATokenizerLL1ToolStripMenuItem.Size = new System.Drawing.Size(216, 26); this.fATokenizerLL1ToolStripMenuItem.Text = "FA Tokeni&zer / LL(1)"; - this.fATokenizerLL1ToolStripMenuItem.Click += new System.EventHandler(this.fATokenizerLL1ToolStripMenuItem_Click); + this.fATokenizerLL1ToolStripMenuItem.Click += new System.EventHandler(this._HandleCreateTokenizerClass); // // toolStripMenuItem2 // this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(210, 6); + this.toolStripMenuItem2.Size = new System.Drawing.Size(213, 6); // // createPCKSpecToolStripMenuItem // this.createPCKSpecToolStripMenuItem.Name = "createPCKSpecToolStripMenuItem"; - this.createPCKSpecToolStripMenuItem.Size = new System.Drawing.Size(213, 26); + this.createPCKSpecToolStripMenuItem.Size = new System.Drawing.Size(216, 26); this.createPCKSpecToolStripMenuItem.Text = "&PCK spec"; - this.createPCKSpecToolStripMenuItem.Click += new System.EventHandler(this.createPCKSpecToolStripMenuItem_Click); + this.createPCKSpecToolStripMenuItem.Click += new System.EventHandler(this._HandleCreatePckSpec); // // createFactoredPCKSpecToolStripMenuItem // this.createFactoredPCKSpecToolStripMenuItem.Name = "createFactoredPCKSpecToolStripMenuItem"; - this.createFactoredPCKSpecToolStripMenuItem.Size = new System.Drawing.Size(213, 26); + this.createFactoredPCKSpecToolStripMenuItem.Size = new System.Drawing.Size(216, 26); this.createFactoredPCKSpecToolStripMenuItem.Text = "&Factored PCK spec"; - this.createFactoredPCKSpecToolStripMenuItem.Click += new System.EventHandler(this.createFactoredPCKSpecToolStripMenuItem_Click); + this.createFactoredPCKSpecToolStripMenuItem.Click += new System.EventHandler(this._HandleCreatePckSpec); // // testToolStripMenuItem // @@ -421,14 +421,14 @@ private void InitializeComponent() this.lL1ParserToolStripMenuItem.Name = "lL1ParserToolStripMenuItem"; this.lL1ParserToolStripMenuItem.Size = new System.Drawing.Size(178, 26); this.lL1ParserToolStripMenuItem.Text = "&LL(1) Parser..."; - this.lL1ParserToolStripMenuItem.Click += new System.EventHandler(this.lL1ParserToolStripMenuItem_Click); + this.lL1ParserToolStripMenuItem.Click += new System.EventHandler(this._HandleTestLL1Parser); // // lalr1ParserToolStripMenuItem // this.lalr1ParserToolStripMenuItem.Name = "lalr1ParserToolStripMenuItem"; this.lalr1ParserToolStripMenuItem.Size = new System.Drawing.Size(178, 26); this.lalr1ParserToolStripMenuItem.Text = "Lal&r(1) Parser..."; - this.lalr1ParserToolStripMenuItem.Click += new System.EventHandler(this.lalr1ParserToolStripMenuItem_Click); + this.lalr1ParserToolStripMenuItem.Click += new System.EventHandler(this._HandleTestLalr1Parser); // // optionsToolStripMenuItem // @@ -531,27 +531,27 @@ private void InitializeComponent() // codeLanguageToolStripMenuItem // this.codeLanguageToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cToolStripMenuItem, - this.vBToolStripMenuItem}); + this.csToolStripMenuItem, + this.vbToolStripMenuItem}); this.codeLanguageToolStripMenuItem.Name = "codeLanguageToolStripMenuItem"; this.codeLanguageToolStripMenuItem.Size = new System.Drawing.Size(403, 26); this.codeLanguageToolStripMenuItem.Text = "Code Language"; // // cToolStripMenuItem // - this.cToolStripMenuItem.Checked = true; - this.cToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; - this.cToolStripMenuItem.Name = "cToolStripMenuItem"; - this.cToolStripMenuItem.Size = new System.Drawing.Size(161, 26); - this.cToolStripMenuItem.Text = "C#"; - this.cToolStripMenuItem.Click += new System.EventHandler(this.cToolStripMenuItem_Click); + this.csToolStripMenuItem.Checked = true; + this.csToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.csToolStripMenuItem.Name = "cToolStripMenuItem"; + this.csToolStripMenuItem.Size = new System.Drawing.Size(161, 26); + this.csToolStripMenuItem.Text = "C#"; + this.csToolStripMenuItem.Click += new System.EventHandler(this.csToolStripMenuItem_Click); // // vBToolStripMenuItem // - this.vBToolStripMenuItem.Name = "vBToolStripMenuItem"; - this.vBToolStripMenuItem.Size = new System.Drawing.Size(161, 26); - this.vBToolStripMenuItem.Text = "Visual Basic"; - this.vBToolStripMenuItem.Click += new System.EventHandler(this.vBToolStripMenuItem_Click); + this.vbToolStripMenuItem.Name = "vBToolStripMenuItem"; + this.vbToolStripMenuItem.Size = new System.Drawing.Size(161, 26); + this.vbToolStripMenuItem.Text = "Visual Basic"; + this.vbToolStripMenuItem.Click += new System.EventHandler(this.vBToolStripMenuItem_Click); // // openFileDialog // @@ -763,8 +763,8 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem createFATokenizerToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; private System.Windows.Forms.ToolStripMenuItem codeLanguageToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem cToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem vBToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem csToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem vbToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem fATokenizerLL1ToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; private System.Windows.Forms.ImageList imageList1; diff --git a/pckedit/Main.cs b/pckedit/Main.cs index 9a0de4b..f376049 100644 --- a/pckedit/Main.cs +++ b/pckedit/Main.cs @@ -10,6 +10,8 @@ using System.Runtime.InteropServices; using Microsoft.Win32; using System.Reflection; +using System.Threading; +using System.Threading.Tasks; namespace Pck { @@ -17,9 +19,12 @@ namespace Pck /// ICSharpCode.TextEditor.TextEditorControl. public partial class Main : Form { + readonly SynchronizationContext _synchronizationContext; + Mru _mru; public Main() { + _synchronizationContext = SynchronizationContext.Current; InitializeComponent(); var smp = new FileSyntaxModeProvider("."); HighlightingManager.Manager.AddSyntaxModeFileProvider(smp); @@ -158,6 +163,11 @@ void _AddMessage(CfgMessage msg,string filename) lvi.ImageIndex = 2; break; } + + messages.BeginInvoke(new Action(_AddLVItem), lvi); + } + private void _AddLVItem(ListViewItem lvi) + { messages.Items.Add(lvi); } void _AddMessage(XbnfMessage msg, string filename) @@ -812,37 +822,32 @@ private void pckFileToolStripMenuItem_Click(object sender, EventArgs e) HighlightingStrategyFactory.CreateHighlightingStrategyForFile("Untitled.pck"); _UpdateMenuContext(); } - - private void createPCKSpecToolStripMenuItem_Click(object sender, EventArgs e) + string _GetUniqueFilename(string filename) { - var fname = _GetFilename(fileTabs.SelectedTab); - XbnfDocument xbnf = null; - try - { - xbnf=XbnfDocument.Parse(ActiveEditor.Text); - } - catch(ExpectingException expex) + var names = new HashSet(); + foreach (var editor in AllEditors) { - _AddMessage(expex,fname); - return; + var name = editor.Parent.Text; + if (name.EndsWith("*")) + name = name.Substring(0, name.Length - 1); + names.Add(name); } - catch(Exception ex) + var i = 2; + var fn = filename; + while (true) { - _AddMessage(ex, fname); - return; + if (names.Contains(fn)) + { + var ext = Path.GetExtension(filename); + fn = Path.GetFileNameWithoutExtension(filename); + fn = string.Concat(fn, i.ToString(), ext); + } + else + return fn; + ++i; } - var name = Path.GetFileNameWithoutExtension(fname); - var sb = new StringBuilder(); - - XbnfToPckTransform.Transform(xbnf, new StringWriter(sb)); - var editor = _AddNewTextEditor(string.Concat(name,".pck")); - name = _GetUniqueFilename(name); - editor.Document.HighlightingStrategy = - HighlightingStrategyFactory.CreateHighlightingStrategyForFile("Untitled.pck"); - editor.Text = sb.ToString(); - SetModifiedFlag(editor, true); } - string _LoadXbnf(string input,string fname=null, ProgressForm form=null) + string _XbnfToPck(string input,string fname=null, Progress form=null) { if (string.IsNullOrEmpty(input)) return input; @@ -872,12 +877,13 @@ string _LoadXbnf(string input,string fname=null, ProgressForm form=null) return sb.ToString(); } - private void createFactoredPCKSpecToolStripMenuItem_Click(object sender, EventArgs e) + async void _HandleCreatePckSpec(object sender, EventArgs e) { - var prog = new ProgressForm(); - var name = _GetFilename(fileTabs.SelectedTab); - var ext = Path.GetExtension(name).ToLowerInvariant(); - name = Path.GetFileNameWithoutExtension(name); + var prog = new Progress(); + var fname = _GetFilename(fileTabs.SelectedTab); + var ext = Path.GetExtension(fname).ToLowerInvariant(); + var name = Path.GetFileNameWithoutExtension(fname); + var factor = ReferenceEquals(sender, createFactoredPCKSpecToolStripMenuItem); messages.Items.Clear(); var hasErrors = false; prog.Show(this); @@ -886,35 +892,42 @@ private void createFactoredPCKSpecToolStripMenuItem_Click(object sender, EventAr switch (ext) { case ".xbnf": - input = _LoadXbnf(input,_GetFilename(fileTabs.SelectedTab),prog); + await Task.Run(()=>{ + input = _XbnfToPck(input, fname, prog); + }); goto case ".pck"; case ".pck": - name = string.Concat(name , ".ll1"); - var cfg = CfgDocument.Parse(input); - var lex = LexDocument.Parse(input); - lex.AttributeSets.Clear(); // prevent attributes from being written twice - foreach (var msg in cfg.TryValidateLL1()) + await Task.Run(() => { - if (CfgErrorLevel.Error == msg.ErrorLevel) - hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); - _AddMessage(msg, (".pck" == ext) ? n : ""); - } - if (!hasErrors) - { - foreach (var msg in cfg.TryPrepareLL1(new _LL1Progress(prog))) + if(factor) + name = string.Concat(name, ".ll1"); + var cfg = CfgDocument.Parse(input); + var lex = LexDocument.Parse(input); + lex.AttributeSets.Clear(); // prevent attributes from being written twice + foreach (var msg in cfg.TryValidateLL1()) { if (CfgErrorLevel.Error == msg.ErrorLevel) hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); - _AddMessage(msg, (".pck" == ext) ? n : ""); + _AddMessage(msg, (".pck" == ext) ? fname : ""); + } + if (!hasErrors && factor) + { + foreach (var msg in cfg.TryPrepareLL1(new _LL1Progress(prog))) + { + if (CfgErrorLevel.Error == msg.ErrorLevel) + hasErrors = true; + _AddMessage(msg, (".pck" == ext) ? fname : ""); + } } - } - if (!hasErrors) + if (!hasErrors) + { + input = string.Concat(cfg.ToString(), Environment.NewLine, lex.ToString()); + name = string.Concat(name, ".pck"); + } + }); + if(!hasErrors) { - input = string.Concat(cfg.ToString(), Environment.NewLine, lex.ToString()); - name = string.Concat(name, ".pck"); name = _GetUniqueFilename(name); var editor = _AddNewTextEditor(name); editor.Document.HighlightingStrategy = @@ -927,248 +940,191 @@ private void createFactoredPCKSpecToolStripMenuItem_Click(object sender, EventAr prog.Close(); } - string _GetUniqueFilename(string filename) + async void _HandleCreateLL1Parser(object sender, EventArgs e) { - var names = new HashSet(); - foreach (var editor in AllEditors) - { - var name = editor.Parent.Text; - if (name.EndsWith("*")) - name = name.Substring(0, name.Length - 1); - names.Add(name); - } - var i = 2; - var fn = filename; - while (true) - { - if (names.Contains(fn)) - { - var ext = Path.GetExtension(filename); - fn = Path.GetFileNameWithoutExtension(filename); - fn = string.Concat(fn, i.ToString(), ext); - } - else - return fn; - ++i; - } - } - private void createLL1ParserToolStripMenuItem_Click(object sender, EventArgs e) - { - var name = _GetFilename(fileTabs.SelectedTab); - var ext = Path.GetExtension(name).ToLowerInvariant(); - name = Path.GetFileNameWithoutExtension(name); + var fname = _GetFilename(fileTabs.SelectedTab); + var ext = Path.GetExtension(fname).ToLowerInvariant(); + var name = Path.GetFileNameWithoutExtension(fname); var input = ActiveEditor.Text; - var prog = new ProgressForm(); + var prog = new Progress(); prog.Show(this); - var sb = new StringBuilder(); var hasErrors = false; + var isVB = vbToolStripMenuItem.Checked; messages.Items.Clear(); switch (ext) { case ".xbnf": - input = _LoadXbnf(input, _GetFilename(fileTabs.SelectedTab), prog); + await Task.Run(() => + { + input = _XbnfToPck(input, _GetFilename(fileTabs.SelectedTab), prog); + }); goto case ".pck"; case ".pck": - var cfg = CfgDocument.Parse(input); - foreach (var msg in cfg.TryValidateLL1()) - { - if (CfgErrorLevel.Error == msg.ErrorLevel) - hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); - _AddMessage(msg, (".pck" == ext) ? n : ""); - } - if (!hasErrors) - { - foreach (var msg in cfg.TryPrepareLL1(new _LL1Progress(prog))) + await Task.Run(() => { + var sb = new StringBuilder(); + var cfg = CfgDocument.Parse(input); + foreach (var msg in cfg.TryValidateLL1()) { if (CfgErrorLevel.Error == msg.ErrorLevel) hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); - _AddMessage(msg, (".pck" == ext) ? n : ""); + _AddMessage(msg, (".pck" == ext) ? fname : ""); } - } - if (!hasErrors) - { - string lang = null; - if (cToolStripMenuItem.Checked) + if (!hasErrors) { - lang = "cs"; - name = string.Concat(name, "Parser.cs"); + foreach (var msg in cfg.TryPrepareLL1(new _LL1Progress(prog))) + { + if (CfgErrorLevel.Error == msg.ErrorLevel) + hasErrors = true; + _AddMessage(msg, (".pck" == ext) ? fname : ""); + } } - else if (vBToolStripMenuItem.Checked) + if (!hasErrors) { - lang = "vb"; - name = string.Concat(name, "Parser.vb"); + string lang = null; + if (!isVB) + { + lang = "cs"; + name = string.Concat(name, "Parser.cs"); + } + else + { + lang = "vb"; + name = string.Concat(name, "Parser.vb"); + } + sb.Clear(); + using (var sw = new StringWriter(sb)) + LL1ParserCodeGenerator.WriteClassTo(cfg, Path.GetFileNameWithoutExtension(name), null, lang, new _LL1Progress(prog), sw); + input = sb.ToString(); } - sb.Clear(); - using (var sw = new StringWriter(sb)) - LL1ParserCodeGenerator.WriteClassTo(cfg, Path.GetFileNameWithoutExtension(name), null, lang,new _LL1Progress(prog), sw); - input = sb.ToString(); + }); + if(!hasErrors) + { name = _GetUniqueFilename(name); var editor = _AddNewTextEditor(name); editor.Document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategyForFile(name); editor.Text = input; - SetModifiedFlag(editor, true); - + SetModifiedFlag(editor, true); } break; } prog.Close(); } - private void createLalr1ParserToolStripMenuItem_Click(object sender, EventArgs e) + async void _HandleCreateLalr1ParserClass(object sender, EventArgs e) { - var name = _GetFilename(fileTabs.SelectedTab); - var ext = Path.GetExtension(name).ToLowerInvariant(); - name = Path.GetFileNameWithoutExtension(name); + var fname = _GetFilename(fileTabs.SelectedTab); + var ext = Path.GetExtension(fname).ToLowerInvariant(); + var name = Path.GetFileNameWithoutExtension(fname); var input = ActiveEditor.Text; - var sb = new StringBuilder(); - var prog = new ProgressForm(); + var prog = new Progress(); prog.Show(this); messages.Items.Clear(); + var isVB = vbToolStripMenuItem.Checked; var hasErrors = false; switch (ext) { case ".xbnf": - input = _LoadXbnf(input, _GetFilename(fileTabs.SelectedTab), prog); - + input = _XbnfToPck(input, fname, prog); goto case ".pck"; case ".pck": - var cfg = CfgDocument.Parse(input); - foreach (var msg in cfg.TryValidateLalr1()) - { - if (CfgErrorLevel.Error == msg.ErrorLevel) - hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); - _AddMessage(msg, (".pck" == ext) ? n : ""); - - } - if (!hasErrors) - { - string lang = null; - if (cToolStripMenuItem.Checked) - { - lang = "cs"; - name = string.Concat(name, "Parser.cs"); - } - else if (vBToolStripMenuItem.Checked) + await Task.Run(()=>{ + var sb = new StringBuilder(); + var cfg = CfgDocument.Parse(input); + foreach (var msg in cfg.TryValidateLalr1()) { - lang = "vb"; - name = string.Concat(name, "Parser.vb"); + if (CfgErrorLevel.Error == msg.ErrorLevel) + hasErrors = true; + _AddMessage(msg, (".pck" == ext) ? fname : ""); + } - sb.Clear(); - using (var sw = new StringWriter(sb)) + if (!hasErrors) { - foreach(var msg in Lalr1ParserCodeGenerator.TryWriteClassTo(cfg, Path.GetFileNameWithoutExtension(name),null, lang,new _Lalr1Progress(prog), sw)) + string lang = null; + if (!isVB) { - if (CfgErrorLevel.Error == msg.ErrorLevel) - hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); - _AddMessage(msg, (".pck" == ext) ? n : ""); + lang = "cs"; + name = string.Concat(name, "Parser.cs"); } + else + { + lang = "vb"; + name = string.Concat(name, "Parser.vb"); + } + sb.Clear(); + using (var sw = new StringWriter(sb)) + { + foreach (var msg in Lalr1ParserCodeGenerator.TryWriteClassTo(cfg, Path.GetFileNameWithoutExtension(name), null, lang, new _Lalr1Progress(prog), sw)) + { + if (CfgErrorLevel.Error == msg.ErrorLevel) + hasErrors = true; + _AddMessage(msg, (".pck" == ext) ? fname : ""); + } + } + if (!hasErrors) + input = sb.ToString(); } - if (!hasErrors) - { - input = sb.ToString(); - name = _GetUniqueFilename(name); - var editor = _AddNewTextEditor(name); - editor.Document.HighlightingStrategy = - HighlightingStrategyFactory.CreateHighlightingStrategyForFile(name); - editor.Text = input; - SetModifiedFlag(editor, true); - } - } - break; - } - prog.Close(); - } - - private void createFATokenizerToolStripMenuItem_Click(object sender, EventArgs e) - { - var prog = new ProgressForm(); - prog.Show(this); - var name = fileTabs.SelectedTab.Text; - if (name.EndsWith("*")) - name = name.Substring(0, name.Length - 1); - var ext = Path.GetExtension(name).ToLowerInvariant(); - name = Path.GetFileNameWithoutExtension(name); - var input = ActiveEditor.Text; - var sb = new StringBuilder(); - switch (ext) - { - case ".xbnf": - input = _LoadXbnf(input, _GetFilename(fileTabs.SelectedTab), prog); - goto case ".pck"; - case ".pck": - var cfg = CfgDocument.Parse(input); - var lex = LexDocument.Parse(input); - string lang = null; - if (cToolStripMenuItem.Checked) - { - lang = "cs"; - name = string.Concat(name, "Tokenizer.cs"); - } - else if (vBToolStripMenuItem.Checked) + }); + if (!hasErrors) { - lang = "vb"; - name = string.Concat(name, "Tokenizer.vb"); + name = _GetUniqueFilename(name); + var editor = _AddNewTextEditor(name); + editor.Document.HighlightingStrategy = + HighlightingStrategyFactory.CreateHighlightingStrategyForFile(name); + editor.Text = input; + SetModifiedFlag(editor, true); } - sb.Clear(); - using (var sw = new StringWriter(sb)) - TokenizerCodeGenerator.WriteClassTo(lex, cfg.FillSymbols(),Path.GetFileNameWithoutExtension(name), null, lang, new _FAProgress(prog),sw); - input = sb.ToString(); - name = _GetUniqueFilename(name); - var editor = _AddNewTextEditor(name); - editor.Document.HighlightingStrategy = - HighlightingStrategyFactory.CreateHighlightingStrategyForFile(name); - editor.Text = input; - SetModifiedFlag(editor, true); + break; } prog.Close(); } - private void fATokenizerLL1ToolStripMenuItem_Click(object sender, EventArgs e) + + async void _HandleCreateTokenizerClass(object sender, EventArgs e) { - var name = _GetFilename(fileTabs.SelectedTab); - var prog = new ProgressForm(); - var ext = Path.GetExtension(name).ToLowerInvariant(); - name = Path.GetFileNameWithoutExtension(name); + var fname = _GetFilename(fileTabs.SelectedTab); + var prog = new Progress(); + var ext = Path.GetExtension(fname).ToLowerInvariant(); + var name = Path.GetFileNameWithoutExtension(fname); var input = ActiveEditor.Text; - var sb = new StringBuilder(); + var factor = ReferenceEquals(sender, fATokenizerLL1ToolStripMenuItem); + var isVB = vbToolStripMenuItem.Checked; var hasErrors = false; messages.Items.Clear(); prog.Show(this); switch (ext) { case ".xbnf": - input = _LoadXbnf(input, _GetFilename(fileTabs.SelectedTab), prog); + input = _XbnfToPck(input, _GetFilename(fileTabs.SelectedTab), prog); goto case ".pck"; case ".pck": - //if(".pck"==ext) + await Task.Run(() => { + var sb = new StringBuilder(); var cfg = CfgDocument.Parse(input); var lex = LexDocument.Parse(input); - foreach (var msg in cfg.TryPrepareLL1(new _LL1Progress(prog))) + if (factor) { - if (CfgErrorLevel.Error == msg.ErrorLevel) - hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); - _AddMessage(msg, (".pck" == ext) ? n : ""); + foreach (var msg in cfg.TryPrepareLL1(new _LL1Progress(prog))) + { + if (CfgErrorLevel.Error == msg.ErrorLevel) + hasErrors = true; + _AddMessage(msg, (".pck" == ext) ? fname : ""); + } + prog.WriteLog(Environment.NewLine); } - prog.WriteLog(Environment.NewLine); if (!hasErrors) { string lang = null; - if (cToolStripMenuItem.Checked) + if (!isVB) { lang = "cs"; name = string.Concat(name, "Tokenizer.cs"); } - else if (vBToolStripMenuItem.Checked) + else { lang = "vb"; name = string.Concat(name, "Tokenizer.vb"); @@ -1176,8 +1132,12 @@ private void fATokenizerLL1ToolStripMenuItem_Click(object sender, EventArgs e) sb.Clear(); using (var sw = new StringWriter(sb)) TokenizerCodeGenerator.WriteClassTo(lex, cfg.FillSymbols(), Path.GetFileNameWithoutExtension(name), null, lang,new _FAProgress(prog), sw); - name = _GetUniqueFilename(name); input = sb.ToString(); + } + }); + if (!hasErrors) + { + name = _GetUniqueFilename(name); var editor = _AddNewTextEditor(name); editor.Document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategyForFile(name); @@ -1224,131 +1184,143 @@ private void messages_ItemSelectionChanged(object sender, ListViewItemSelectionC } } - private void cToolStripMenuItem_Click(object sender, EventArgs e) + private void csToolStripMenuItem_Click(object sender, EventArgs e) { - cToolStripMenuItem.Checked = true; - vBToolStripMenuItem.Checked = false; + csToolStripMenuItem.Checked = true; + vbToolStripMenuItem.Checked = false; } private void vBToolStripMenuItem_Click(object sender, EventArgs e) { - cToolStripMenuItem.Checked = false; - vBToolStripMenuItem.Checked = true; + csToolStripMenuItem.Checked = false; + vbToolStripMenuItem.Checked = true; } - private void lL1ParserToolStripMenuItem_Click(object sender, EventArgs e) + async void _HandleTestLL1Parser(object sender, EventArgs e) { - var name = _GetFilename(fileTabs.SelectedTab); - var ext = Path.GetExtension(name).ToLowerInvariant(); - name = Path.GetFileNameWithoutExtension(name); + var fname = _GetFilename(fileTabs.SelectedTab); + var ext = Path.GetExtension(fname).ToLowerInvariant(); + var name = Path.GetFileNameWithoutExtension(fname); var input = ActiveEditor.Text; - var prog = new ProgressForm(); + var prog = new Progress(); prog.Show(this); + var test = new Test(); + test.Text = string.Concat(test.Text, " - ", fname); var sb = new StringBuilder(); var hasErrors = false; messages.Items.Clear(); - switch (ext) + await Task.Run(() => { - case ".xbnf": - input = _LoadXbnf(input, _GetFilename(fileTabs.SelectedTab), prog); - goto case ".pck"; - case ".pck": - var cfg = CfgDocument.Parse(input); - var lex = LexDocument.Parse(input); - foreach (var msg in cfg.TryValidateLL1()) - { - if (CfgErrorLevel.Error == msg.ErrorLevel) - hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); - _AddMessage(msg, (".pck" == ext) ? n : ""); - } - if (!hasErrors) - { - foreach (var msg in cfg.TryPrepareLL1(new _LL1Progress(prog))) + switch (ext) + { + case ".xbnf": + input = _XbnfToPck(input, fname, prog); + goto case ".pck"; + case ".pck": + var cfg = CfgDocument.Parse(input); + var lex = LexDocument.Parse(input); + foreach (var msg in cfg.TryValidateLL1()) { if (CfgErrorLevel.Error == msg.ErrorLevel) hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); + var n = fname; _AddMessage(msg, (".pck" == ext) ? n : ""); } - } - if (!hasErrors) - { - var test = new Test(); - test.Text = string.Concat(test.Text, " - ", _GetFilename(fileTabs.SelectedTab)); - var tokenizer = lex.ToTokenizer(test.Input, cfg.EnumSymbols(), new _FAProgress(prog)); - LL1Parser parser; - foreach (var msg in cfg.TryToLL1Parser(out parser, tokenizer, new _LL1Progress(prog))) + if (!hasErrors) { - if (CfgErrorLevel.Error == msg.ErrorLevel) - hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); - _AddMessage(msg, (".pck" == ext) ? n : ""); + foreach (var msg in cfg.TryPrepareLL1(new _LL1Progress(prog))) + { + if (CfgErrorLevel.Error == msg.ErrorLevel) + hasErrors = true; + var n = fname; + _AddMessage(msg, (".pck" == ext) ? n : ""); + } } if (!hasErrors) { - test.SetParser(parser); - test.Show(this); + var tokenizer = lex.ToTokenizer(null, cfg.EnumSymbols(), new _FAProgress(prog)); + LL1Parser parser; + foreach (var msg in cfg.TryToLL1Parser(out parser, tokenizer, new _LL1Progress(prog))) + { + if (CfgErrorLevel.Error == msg.ErrorLevel) + hasErrors = true; + var n = fname; + _AddMessage(msg, (".pck" == ext) ? n : ""); + } + if (!hasErrors) + { + test.SetParser(parser); + BeginInvoke(new Action
(test.Show), this); + + } + else BeginInvoke(new Action(test.Close)); + } - else test.Close(); - } + else BeginInvoke(new Action(test.Close)); - break; - } + break; + } + }); prog.Close(); } - private void lalr1ParserToolStripMenuItem_Click(object sender, EventArgs e) + private async void _HandleTestLalr1Parser(object sender, EventArgs e) { - var name = _GetFilename(fileTabs.SelectedTab); - var ext = Path.GetExtension(name).ToLowerInvariant(); - name = Path.GetFileNameWithoutExtension(name); - var input = ActiveEditor.Text; - var prog = new ProgressForm(); + var prog = new Progress(); prog.Show(this); + var fname = _GetFilename(fileTabs.SelectedTab); + var ext = Path.GetExtension(fname).ToLowerInvariant(); + var name = Path.GetFileNameWithoutExtension(fname); + var input = ActiveEditor.Text; var sb = new StringBuilder(); var hasErrors = false; messages.Items.Clear(); - switch (ext) - { - case ".xbnf": - input = _LoadXbnf(input, _GetFilename(fileTabs.SelectedTab), prog); - goto case ".pck"; - case ".pck": - var cfg = CfgDocument.Parse(input); - var lex = LexDocument.Parse(input); - foreach (var msg in cfg.TryValidateLalr1()) - { - if (CfgErrorLevel.Error == msg.ErrorLevel) - hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); - _AddMessage(msg, (".pck" == ext) ? n : ""); - } - if (!hasErrors) - { - var test = new Test(); - test.Text = string.Concat(test.Text, " - ", _GetFilename(fileTabs.SelectedTab)); - var tokenizer = lex.ToTokenizer(test.Input, cfg.EnumSymbols(), new _FAProgress(prog)); - Lalr1Parser parser; - foreach (var msg in cfg.TryToLalr1Parser(out parser, tokenizer, new _Lalr1Progress(prog))) + var test = new Test(); + test.Text = string.Concat(test.Text, " - ", fname); + await Task.Run(() => { + switch (ext) + { + case ".xbnf": + input = _XbnfToPck(input, fname, prog); + goto case ".pck"; + case ".pck": + var cfg = CfgDocument.Parse(input); + var lex = LexDocument.Parse(input); + foreach (var msg in cfg.TryValidateLalr1()) { if (CfgErrorLevel.Error == msg.ErrorLevel) hasErrors = true; - var n = _GetFilename(fileTabs.SelectedTab); + var n = fname; _AddMessage(msg, (".pck" == ext) ? n : ""); } if (!hasErrors) { - test.SetParser(parser); - test.Show(this); + var tokenizer = lex.ToTokenizer(null, cfg.EnumSymbols(), new _FAProgress(prog)); + Lalr1Parser parser; + foreach (var msg in cfg.TryToLalr1Parser(out parser, tokenizer, new _Lalr1Progress(prog))) + { + if (CfgErrorLevel.Error == msg.ErrorLevel) + hasErrors = true; + var n = fname; + _AddMessage(msg, (".pck" == ext) ? n : ""); + } + + if (!hasErrors) + { + test.SetParser(parser); + BeginInvoke(new Action(test.Show), this); + } + else BeginInvoke(new Action(test.Close)); } - else test.Close(); - } + else + BeginInvoke(new Action(test.Close)); - break; - } + break; + } + + }); prog.Close(); } @@ -1369,9 +1341,9 @@ private void redoToolStripMenuItem_Click(object sender, EventArgs e) #region _FAProgress class _FAProgress : IProgress { - ProgressForm _form; + Progress _form; FAStatus _oldStatus; - public _FAProgress(ProgressForm form) + public _FAProgress(Progress form) { _form = form; } @@ -1402,9 +1374,9 @@ public void Report(FAProgress value) #region _Lalr1Progress class _Lalr1Progress : IProgress { - ProgressForm _form; + Progress _form; CfgLalr1Status _oldStatus; - public _Lalr1Progress(ProgressForm form) + public _Lalr1Progress(Progress form) { _form = form; } @@ -1450,9 +1422,9 @@ public void Report(CfgLalr1Progress value) #region _LL1Progress class _LL1Progress : IProgress { - ProgressForm _form; + Progress _form; CfgLL1Status _oldStatus; - public _LL1Progress(ProgressForm form) + public _LL1Progress(Progress form) { _form = form; } diff --git a/pckedit/Main.resx b/pckedit/Main.resx index e0c13c7..496dbf2 100644 --- a/pckedit/Main.resx +++ b/pckedit/Main.resx @@ -137,7 +137,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABq - CgAAAk1TRnQBSQFMAgEBAwEAAUABAAFAAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CgAAAk1TRnQBSQFMAgEBAwEAAVABAAFQAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA diff --git a/pckedit/ProgressForm.Designer.cs b/pckedit/Progress.Designer.cs similarity index 98% rename from pckedit/ProgressForm.Designer.cs rename to pckedit/Progress.Designer.cs index 8374211..21a72f2 100644 --- a/pckedit/ProgressForm.Designer.cs +++ b/pckedit/Progress.Designer.cs @@ -1,6 +1,6 @@ namespace Pck { - partial class ProgressForm + partial class Progress { /// /// Required designer variable. diff --git a/pckedit/ProgressForm.cs b/pckedit/Progress.cs similarity index 54% rename from pckedit/ProgressForm.cs rename to pckedit/Progress.cs index 188ca30..309220b 100644 --- a/pckedit/ProgressForm.cs +++ b/pckedit/Progress.cs @@ -10,20 +10,24 @@ namespace Pck { - public partial class ProgressForm : Form + public partial class Progress : Form { - public ProgressForm() + public Progress() { InitializeComponent(); } + public void ClearLog() { - StatusBox.Text = ""; + StatusBox.BeginInvoke(new Action(_ClearLog),null); } + void _ClearLog(string dummy) { StatusBox.Text = "";Application.DoEvents(); } public void WriteLog(string @string) { if(null!=@string) - StatusBox.AppendText(@string); + StatusBox.BeginInvoke(new Action(StatusBox.AppendText),@string); + Application.DoEvents(); } + } } diff --git a/pckedit/ProgressForm.resx b/pckedit/Progress.resx similarity index 100% rename from pckedit/ProgressForm.resx rename to pckedit/Progress.resx diff --git a/pckedit/Test.cs b/pckedit/Test.cs index 68c1cbe..e748138 100644 --- a/pckedit/Test.cs +++ b/pckedit/Test.cs @@ -38,36 +38,7 @@ public void SetParser(Lalr1Parser parser) _ll1Parser.Close(); _ll1Parser = null; } - class _InputEnumerable : IEnumerable - { - Test _outer; - public _InputEnumerable(Test outer) { _outer = outer; } - - public IEnumerator GetEnumerator() { return new _InputEnumerator(_outer); } - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - } - class _InputEnumerator : IEnumerator - { - Test _outer; - IEnumerator _inner; - public _InputEnumerator(Test outer) { _outer = outer; Reset(); } - - public char Current => _inner.Current; - object IEnumerator.Current => _inner.Current; - - public void Dispose() { if (null != _inner) _inner.Dispose(); } - - public bool MoveNext() - => _inner.MoveNext(); - - public void Reset() - { - if (null != _inner) _inner.Dispose(); - _inner = _outer.editor.Text.GetEnumerator(); - } - } - public IEnumerable Input { get { return new _InputEnumerable(this); } } - + private void editor_TextChanged(object sender, EventArgs e) { parseTimer.Enabled = true; @@ -79,7 +50,7 @@ private void parseTimer_Tick(object sender, EventArgs e) ParseNode pt=null; if (null != _ll1Parser) { - _ll1Parser.Restart(); + _ll1Parser.Restart(editor.Text); _ll1Parser.ShowHidden = showHidden.Checked; while(LLNodeType.EndDocument!=_ll1Parser.NodeType) { @@ -89,7 +60,7 @@ private void parseTimer_Tick(object sender, EventArgs e) } } else if(null!=_lalr1Parser) { - _lalr1Parser.Restart(); + _lalr1Parser.Restart(editor.Text); _lalr1Parser.ShowHidden = showHidden.Checked; var opt = pt; while (LRNodeType.EndDocument != _lalr1Parser.NodeType) diff --git a/pckedit/pckedit.csproj b/pckedit/pckedit.csproj index 462f320..e1b5d74 100644 --- a/pckedit/pckedit.csproj +++ b/pckedit/pckedit.csproj @@ -100,11 +100,11 @@ - + Form - - ProgressForm.cs + + Progress.cs @@ -258,8 +258,8 @@ Main.cs Designer - - ProgressForm.cs + + Progress.cs ResXFileCodeGenerator diff --git a/pckw/LL1ParserCodeGenerator.cs b/pckw/LL1ParserCodeGenerator.cs index e996de9..2a53c66 100644 --- a/pckw/LL1ParserCodeGenerator.cs +++ b/pckw/LL1ParserCodeGenerator.cs @@ -138,7 +138,7 @@ static IList _CreateParserClass(CfgDocument cfg,string name,IProgres parserClass.Members.Add(f); var ctor = new CodeConstructor(); - ctor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(IEnumerable), "tokenizer")); + ctor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(ITokenizer), "tokenizer")); ctor.BaseConstructorArgs.AddRange(new CodeExpression[] { new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(parserClass.Name), "_ParseTable"), new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(parserClass.Name), "_InitCfg"), diff --git a/pckw/Lalr1ParserCodeGenerator.cs b/pckw/Lalr1ParserCodeGenerator.cs index b855fc1..e66c2d5 100644 --- a/pckw/Lalr1ParserCodeGenerator.cs +++ b/pckw/Lalr1ParserCodeGenerator.cs @@ -129,7 +129,7 @@ static IList _CreateParserClass(CfgDocument cfg, string name,IProgre parserClass.Members.Add(f); var ctor = new CodeConstructor(); - ctor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(IEnumerable), "tokenizer")); + ctor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(ITokenizer), "tokenizer")); ctor.BaseConstructorArgs.AddRange(new CodeExpression[] { new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(parserClass.Name), "_ParseTable"), new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(parserClass.Name), "_Symbols"), diff --git a/scratch/ExprParser.cs b/scratch/ExprParser.cs index e1055ee..42b8003 100644 --- a/scratch/ExprParser.cs +++ b/scratch/ExprParser.cs @@ -127,7 +127,7 @@ public class ExprParser : Pck.LL1TableParser { null, null, null}; - public ExprParser(System.Collections.Generic.IEnumerable tokenizer) : + public ExprParser(Pck.ITokenizer tokenizer) : base(ExprParser._ParseTable, ExprParser._InitCfg, ExprParser._Symbols, ExprParser._NodeFlags, ExprParser._Substitutions, ExprParser._AttributeSets, tokenizer) { } public ExprParser() : diff --git a/scratch/XbnfParser.cs b/scratch/XbnfParser.cs index 4e81d29..71557db 100644 --- a/scratch/XbnfParser.cs +++ b/scratch/XbnfParser.cs @@ -2605,7 +2605,7 @@ public class XbnfParser : Pck.Lalr1TableParser { new System.Collections.Generic.KeyValuePair("color", "green")}, null, null}; - public XbnfParser(System.Collections.Generic.IEnumerable tokenizer) : + public XbnfParser(Pck.ITokenizer tokenizer) : base(XbnfParser._ParseTable, XbnfParser._Symbols, XbnfParser._NodeFlags, XbnfParser._Substitutions, XbnfParser._AttributeSets, tokenizer) { } public XbnfParser() :