compiler/PPCTokenizingConfiguration.st
changeset 530 e36906742693
parent 529 439c4057517f
child 531 dc3d13c2837d
equal deleted inserted replaced
529:439c4057517f 530:e36906742693
     1 "{ Package: 'stx:goodies/petitparser/compiler' }"
     1 "{ Package: 'stx:goodies/petitparser/compiler' }"
     2 
     2 
     3 "{ NameSpace: Smalltalk }"
     3 "{ NameSpace: Smalltalk }"
     4 
     4 
     5 PPCConfiguration subclass:#PPCTokenizingConfiguration
     5 PPCConfiguration subclass:#PPCTokenizingConfiguration
     6 	instanceVariableNames:'scannerClazz parserClazz idGen'
     6 	instanceVariableNames:''
     7 	classVariableNames:''
     7 	classVariableNames:''
     8 	poolDictionaries:''
     8 	poolDictionaries:''
     9 	category:'PetitCompiler-Core'
     9 	category:'PetitCompiler-Core'
    10 !
    10 !
    11 
    11 
       
    12 
    12 !PPCTokenizingConfiguration methodsFor:'compiling'!
    13 !PPCTokenizingConfiguration methodsFor:'compiling'!
    13 
       
    14 options: args
       
    15     super options: args.
       
    16 !
       
    17 
    14 
    18 buildClass: clazz
    15 buildClass: clazz
    19     |  builder |
    16     |  builder |
    20     builder := PPCClassBuilder new.
    17     builder := PPCClassBuilder new.
    21     
    18     
    46     self createFSAs.
    43     self createFSAs.
    47     self buildScannerTokens.
    44     self buildScannerTokens.
    48     self buildScannerScans.	
    45     self buildScannerScans.	
    49     self generateScanner.
    46     self generateScanner.
    50     self generateParser.
    47     self generateParser.
    51 ! !
       
    52 
       
    53 !PPCTokenizingConfiguration methodsFor:'initialization'!
       
    54 
       
    55 fillInClazzes
       
    56     parserClazz name: options parserName.
       
    57     parserClazz superclass: PPTokenizingCompiledParser.
       
    58     
       
    59     scannerClazz name: options scannerName.
       
    60     scannerClazz superclass: options scannerSuperclass.
       
    61     
       
    62 !
    48 !
    63 
    49 
    64 initialize
    50 options: args
    65     super initialize.
    51     super options: args.
    66     
       
    67     parserClazz := PPCClass new.
       
    68     scannerClazz := PPCClass new.
       
    69     
       
    70     idGen := PPCIdGenerator new.
       
    71     
       
    72     "The parser and scanner share the same id generator in order
       
    73      to use same names for tokens.
       
    74     "
       
    75     parserClazz idGen: idGen.
       
    76     scannerClazz idGen: idGen.
       
    77 ! !
    52 ! !
    78 
    53 
    79 !PPCTokenizingConfiguration methodsFor:'phases'!
    54 !PPCTokenizingConfiguration methodsFor:'phases'!
    80 
    55 
    81 buildParserClazz
    56 buildParserClazz
    82     | rootMethod |
    57     | rootMethod |
    83     rootMethod := PPCTokenizingCodeGenerator new
    58     rootMethod := PPCTokenizingCodeGenerator new
    84         clazz: parserClazz;
    59         clazz: context parserClass;
    85         options: options;
    60         options: options;
    86         visit: ir.
    61         visit: ir.
    87         
    62         
    88     parserClazz propertyAt: #rootMethod put: rootMethod
    63     context parserClass propertyAt: #rootMethod put: rootMethod
       
    64 
       
    65     "Modified: / 25-08-2015 / 00:07:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    89 !
    66 !
    90 
    67 
    91 buildScannerScans
    68 buildScannerScans
    92     | fsas  generator |
    69     | fsas  generator |
    93     
    70     
    96     fsas addAll: (ir allNodes select: [ :node | node hasFsa ] thenCollect: [:node | node fsa]).
    73     fsas addAll: (ir allNodes select: [ :node | node hasFsa ] thenCollect: [:node | node fsa]).
    97     fsas addAll: (ir allNodes select: [ :node | node hasNextFsa ] thenCollect: [:node | node nextFsa]).
    74     fsas addAll: (ir allNodes select: [ :node | node hasNextFsa ] thenCollect: [:node | node nextFsa]).
    98     fsas := fsas reject: [ :fsa | fsa hasDistinctRetvals not ].
    75     fsas := fsas reject: [ :fsa | fsa hasDistinctRetvals not ].
    99     
    76     
   100     generator := PPCScannerCodeGenerator new
    77     generator := PPCScannerCodeGenerator new
   101         clazz: scannerClazz;
    78         clazz: context scannerClass;
   102         options: options;
    79         options: options;
   103         yourself.
    80         yourself.
   104         
    81         
   105     fsas do: [ :fsa | generator generate: fsa ].
    82     fsas do: [ :fsa | generator generate: fsa ].
       
    83 
       
    84     "Modified: / 25-08-2015 / 00:04:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   106 !
    85 !
   107 
    86 
   108 buildScannerTokens
    87 buildScannerTokens
   109     | generator  |
    88     | generator  |
   110     generator :=  PPCTokenCodeGenerator new
    89     generator :=  PPCTokenCodeGenerator new
   111         clazz: scannerClazz;
    90         clazz: context scannerClass;
   112         options: options;
    91         options: options;
   113         yourself.
    92         yourself.
   114 
    93 
   115     generator visit: ir.
    94     generator visit: ir.
       
    95 
       
    96     "Modified: / 25-08-2015 / 00:04:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   116 !
    97 !
   117 
    98 
   118 createFSAs
    99 createFSAs
   119     ir := PPCFSAVisitor new
   100     ir := PPCFSAVisitor new
   120         idGen: idGen;
   101         idGen: context scannerClass idGen;
   121         visit: ir.
   102         visit: ir.
   122 
   103 
   123     self remember: (self copyTree: ir) as: #withFSAs
   104     self remember: (self copyTree: ir) as: #withFSAs
       
   105 
       
   106     "Modified: / 25-08-2015 / 00:07:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   124 !
   107 !
   125 
   108 
   126 createLL1Choices
   109 createLL1Choices
   127     self flag: 'This phase needs revisit and update'.
   110     self flag: 'This phase needs revisit and update'.
   128     
   111     
   134 !
   117 !
   135 
   118 
   136 generateParser
   119 generateParser
   137     | parserClass rootMethod |
   120     | parserClass rootMethod |
   138     options generate ifFalse: [ ^ self ].
   121     options generate ifFalse: [ ^ self ].
   139     rootMethod := parserClazz propertyAt: #rootMethod.
   122     rootMethod := context parserClass propertyAt: #rootMethod.
   140     
   123     
   141     parserClazz name: options parserName.
   124     context parserClass name: options parserName.
   142     parserClazz superclass: options parserSuperclass.
   125     context parserClass superclass: options parserSuperclass.
   143     
   126     
   144     parserClass := self buildClass: parserClazz.
   127     parserClass := self buildClass: context parserClass.
   145     parserClass startSymbol: rootMethod methodName.
   128     parserClass startSymbol: rootMethod methodName.
   146 
   129 
   147     self remember: parserClass as: #parser.
   130     self remember: parserClass as: #parser.
   148     ir := parserClass new
   131     ir := parserClass new
   149 
   132 
   150     
   133     "Modified: / 25-08-2015 / 00:05:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   151 !
   134 !
   152 
   135 
   153 generateScanner
   136 generateScanner
   154     | scanner |
   137     | scanner |
   155     options generate ifFalse: [ ^ self ].
   138     options generate ifFalse: [ ^ self ].
   156     
   139     
   157     scannerClazz name: options scannerName.
   140     context scannerClass name: options scannerName.
   158     scannerClazz superclass: options scannerSuperclass.
   141     context scannerClass superclass: options scannerSuperclass.
   159     
   142     
   160     scanner := (self buildClass: scannerClazz).
   143     scanner := (self buildClass: context scannerClass).
   161     parserClazz addConstant: scanner as: #scannerClass.
   144     context parserClass addConstant: scanner as: #scannerClass.
   162     
   145     
   163     ir := scanner.
   146     ir := scanner.
   164     
   147     
   165     self remember: scanner as: #scanner
   148     self remember: scanner as: #scanner
       
   149 
       
   150     "Modified: / 25-08-2015 / 00:06:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   166 !
   151 !
   167 
   152 
   168 tokenize
   153 tokenize
   169     "
   154     "
   170         This will try transform the parser into the tokenizing parser
   155         This will try transform the parser into the tokenizing parser
   186             node unmarkForInline
   171             node unmarkForInline
   187         ]
   172         ]
   188     ]
   173     ]
   189 ! !
   174 ! !
   190 
   175 
       
   176 !PPCTokenizingConfiguration class methodsFor:'documentation'!
       
   177 
       
   178 version_HG
       
   179 
       
   180     ^ '$Changeset: <not expanded> $'
       
   181 ! !
       
   182