SmaCC__SmaCCParserGenerator.st
changeset 11 275a29d74b86
parent 10 7d698124b227
child 15 8b8cd1701c33
--- a/SmaCC__SmaCCParserGenerator.st	Wed Aug 12 09:23:35 2009 +0000
+++ b/SmaCC__SmaCCParserGenerator.st	Sun Aug 16 17:09:03 2009 +0000
@@ -910,6 +910,14 @@
                   itemValue: compileLR1
                   translateLabel: true
                 )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  label: 'Compile Highlighter'
+                  itemValue: compileHighlighter
+                  translateLabel: true
+                )
                )
               nil
               nil
@@ -936,12 +944,28 @@
         nil
         nil
       )
-
-    "Modified: / 12-05-2007 / 21:08:14 / janfrog"
 ! !
 
 !SmaCCParserGenerator methodsFor:'accessing'!
 
+highlighterClass
+
+    ^RBClass new 
+        name: self highlighterClassName asSymbol;
+        model: (RBNamespace new
+                    name: 'Compile Highlighter';
+                    yourself);
+        yourself
+
+    "Created: / 14-08-2009 / 20:41:48 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+highlighterClassName
+    ^ self highlighterClassNameHolder value
+
+    "Created: / 14-08-2009 / 20:27:28 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
 loadScannerAndParserFromFile
 
     ^self loadScannerAndParserFromFileHolder value
@@ -1111,6 +1135,48 @@
     "Modified: / 11-05-2007 / 12:24:42 / janfrog"
 !
 
+compileHighlighter 
+    |grammar class changes oldIgnoreCase oldCharacterSize scannerCompiler |
+
+    self acceptDefinitions.
+    (self highlighterClassName isEmpty or:[ self parserClassName isEmpty ]) ifTrue:[
+        ^ self warn:'Syntax highlighter and/or parser class name not specified'
+    ].
+    self 
+        withWaitCursorDo:[
+            self verifySyntax ifFalse:[
+                ^ self
+            ].
+            oldIgnoreCase := SmaCCGrammar ignoreCase.
+            oldCharacterSize := SmaCCGrammar maximumCharacterValue.
+            [
+                SmaCCGrammar
+                    ignoreCase:self ignoreCaseHolder value;
+                    maximumCharacterValue:(self allowUnicodeHolder value 
+                                ifTrue:[ (2 raisedTo:16) - 1 ]
+                                ifFalse:[ 255 ]).
+                grammar := SmaCCGrammar new.
+                scannerCompiler := 
+                    SmaCCScannerCompiler new                                    
+                        scannerDefinitionString: self scannerDefinition;
+                        scannerClass: (class := self highlighterClass);
+                        grammar: grammar;
+                        parseTokens.
+                (SmaCCGrammarParser on: (ReadStream on: self parserDefinition))
+                    grammar: grammar;
+                    parse.
+                scannerCompiler compileScanner.
+                changes := class model changes.
+                RefactoryChangeManager instance performChange: changes.
+                (Smalltalk at: class name) initializeKeywordMap.
+
+            ] on: Error do: [:ex|ex pass]
+    ].
+
+    "Modified: / 14-02-2008 / 13:30:27 / janfrog"
+    "Created: / 14-08-2009 / 20:29:49 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
 compileLALR1
         self compile: #LALR1
 
@@ -1137,6 +1203,17 @@
     "Modified: / 11-08-2009 / 17:50:42 / Jan Vrany <vranyj1@fel.cvut.cz>"
 !
 
+findHighlighterClass
+        | class |
+        class := self 
+                    choose: 'What class do you want to use?'
+                    from: (SmaCCScanner allSubclasses asSortedCollection: [:a :b | a name < b name]).
+        class isNil ifTrue: [^self].
+        self highlighterClassNameHolder value: class fullName.
+
+    "Created: / 14-08-2009 / 20:25:12 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
 findParserClass
         | class |
         class := self choose: 'What class do you want to use?'