compiler/PPCTokenizingConfiguration.st
changeset 529 439c4057517f
parent 525 751532c8f3db
child 530 e36906742693
equal deleted inserted replaced
528:ebfddc82b8bb 529:439c4057517f
     9 	category:'PetitCompiler-Core'
     9 	category:'PetitCompiler-Core'
    10 !
    10 !
    11 
    11 
    12 !PPCTokenizingConfiguration methodsFor:'compiling'!
    12 !PPCTokenizingConfiguration methodsFor:'compiling'!
    13 
    13 
    14 arguments: args
    14 options: args
    15     super arguments: args.
    15     super options: args.
    16 !
    16 !
    17 
    17 
    18 buildClass: clazz
    18 buildClass: clazz
    19     |  builder |
    19     |  builder |
    20     builder := PPCClassBuilder new.
    20     builder := PPCClassBuilder new.
    51 ! !
    51 ! !
    52 
    52 
    53 !PPCTokenizingConfiguration methodsFor:'initialization'!
    53 !PPCTokenizingConfiguration methodsFor:'initialization'!
    54 
    54 
    55 fillInClazzes
    55 fillInClazzes
    56     parserClazz name: arguments parserName.
    56     parserClazz name: options parserName.
    57     parserClazz superclass: PPTokenizingCompiledParser.
    57     parserClazz superclass: PPTokenizingCompiledParser.
    58     
    58     
    59     scannerClazz name: arguments scannerName.
    59     scannerClazz name: options scannerName.
    60     scannerClazz superclass: arguments scannerSuperclass.
    60     scannerClazz superclass: options scannerSuperclass.
    61     
    61     
    62 !
    62 !
    63 
    63 
    64 initialize
    64 initialize
    65     super initialize.
    65     super initialize.
    80 
    80 
    81 buildParserClazz
    81 buildParserClazz
    82     | rootMethod |
    82     | rootMethod |
    83     rootMethod := PPCTokenizingCodeGenerator new
    83     rootMethod := PPCTokenizingCodeGenerator new
    84         clazz: parserClazz;
    84         clazz: parserClazz;
    85         arguments: arguments;
    85         options: options;
    86         visit: ir.
    86         visit: ir.
    87         
    87         
    88     parserClazz propertyAt: #rootMethod put: rootMethod
    88     parserClazz propertyAt: #rootMethod put: rootMethod
    89 !
    89 !
    90 
    90 
    97     fsas addAll: (ir allNodes select: [ :node | node hasNextFsa ] thenCollect: [:node | node nextFsa]).
    97     fsas addAll: (ir allNodes select: [ :node | node hasNextFsa ] thenCollect: [:node | node nextFsa]).
    98     fsas := fsas reject: [ :fsa | fsa hasDistinctRetvals not ].
    98     fsas := fsas reject: [ :fsa | fsa hasDistinctRetvals not ].
    99     
    99     
   100     generator := PPCScannerCodeGenerator new
   100     generator := PPCScannerCodeGenerator new
   101         clazz: scannerClazz;
   101         clazz: scannerClazz;
   102         arguments: arguments;
   102         options: options;
   103         yourself.
   103         yourself.
   104         
   104         
   105     fsas do: [ :fsa | generator generate: fsa ].
   105     fsas do: [ :fsa | generator generate: fsa ].
   106 !
   106 !
   107 
   107 
   108 buildScannerTokens
   108 buildScannerTokens
   109     | generator  |
   109     | generator  |
   110     generator :=  PPCTokenCodeGenerator new
   110     generator :=  PPCTokenCodeGenerator new
   111         clazz: scannerClazz;
   111         clazz: scannerClazz;
   112         arguments: arguments;
   112         options: options;
   113         yourself.
   113         yourself.
   114 
   114 
   115     generator visit: ir.
   115     generator visit: ir.
   116 !
   116 !
   117 
   117 
   125 
   125 
   126 createLL1Choices
   126 createLL1Choices
   127     self flag: 'This phase needs revisit and update'.
   127     self flag: 'This phase needs revisit and update'.
   128     
   128     
   129     ir :=  PPCLL1Visitor new
   129     ir :=  PPCLL1Visitor new
   130         arguments: arguments;
   130         options: options;
   131         visit: ir.
   131         visit: ir.
   132         
   132         
   133     self remember: (self copyTree: ir) as: #LL1
   133     self remember: (self copyTree: ir) as: #LL1
   134 !
   134 !
   135 
   135 
   136 generateParser
   136 generateParser
   137     | parserClass rootMethod |
   137     | parserClass rootMethod |
   138     arguments generate ifFalse: [ ^ self ].
   138     options generate ifFalse: [ ^ self ].
   139     rootMethod := parserClazz propertyAt: #rootMethod.
   139     rootMethod := parserClazz propertyAt: #rootMethod.
   140     
   140     
   141     parserClazz name: arguments parserName.
   141     parserClazz name: options parserName.
   142     parserClazz superclass: arguments parserSuperclass.
   142     parserClazz superclass: options parserSuperclass.
   143     
   143     
   144     parserClass := self buildClass: parserClazz.
   144     parserClass := self buildClass: parserClazz.
   145     parserClass startSymbol: rootMethod methodName.
   145     parserClass startSymbol: rootMethod methodName.
   146 
   146 
   147     self remember: parserClass as: #parser.
   147     self remember: parserClass as: #parser.
   150     
   150     
   151 !
   151 !
   152 
   152 
   153 generateScanner
   153 generateScanner
   154     | scanner |
   154     | scanner |
   155     arguments generate ifFalse: [ ^ self ].
   155     options generate ifFalse: [ ^ self ].
   156     
   156     
   157     scannerClazz name: arguments scannerName.
   157     scannerClazz name: options scannerName.
   158     scannerClazz superclass: arguments scannerSuperclass.
   158     scannerClazz superclass: options scannerSuperclass.
   159     
   159     
   160     scanner := (self buildClass: scannerClazz).
   160     scanner := (self buildClass: scannerClazz).
   161     parserClazz addConstant: scanner as: #scannerClass.
   161     parserClazz addConstant: scanner as: #scannerClass.
   162     
   162     
   163     ir := scanner.
   163     ir := scanner.
   167 
   167 
   168 tokenize
   168 tokenize
   169     "
   169     "
   170         This will try transform the parser into the tokenizing parser
   170         This will try transform the parser into the tokenizing parser
   171     "
   171     "
   172     arguments tokenize ifFalse: [ ^ self ] .
   172     options tokenize ifFalse: [ ^ self ] .
   173     
   173     
   174     ir :=  PPCTokenizingVisitor new
   174     ir :=  PPCTokenizingVisitor new
   175         arguments: arguments;
   175         options: options;
   176         visit: ir.
   176         visit: ir.
   177         
   177         
   178         
   178         
   179     self remember: (self copyTree: ir) as: #tokenize
   179     self remember: (self copyTree: ir) as: #tokenize
   180 !
   180 !