devtools/XBGFParser.st
author sr
Wed, 04 Jul 2018 15:30:19 +0200
changeset 611 38338f2de417
parent 103 ea95f0757386
permissions -rw-r--r--
build order was wrong
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
98
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/petitparser/devtools' }"
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
Object subclass:#XBGFParser
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
	instanceVariableNames:'productions'
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
	classVariableNames:''
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
	poolDictionaries:''
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
	category:'PetitParser-Utils'
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
!XBGFParser class methodsFor:'documentation'!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
documentation
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
"
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
    A parse to parse XBGF grammar definitions
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
    [author:]
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
        Jan Vrany <jan.vrany@fit.cvut.cz>
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
    [instance variables:]
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
    [class variables:]
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
    [see also:]
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
        http://slps.github.com/
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
"
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
! !
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
!XBGFParser methodsFor:'accessing'!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
productionAt: id
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
    productions isNil ifTrue:[productions := Dictionary new].
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
    ^productions at: id ifAbsentPut:[PPUnresolvedParser named: id]
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
    "Created: / 10-01-2013 / 12:03:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
103
ea95f0757386 Added PPCompositeParserGenerator & PPParserVisitor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 98
diff changeset
    36
!
ea95f0757386 Added PPCompositeParserGenerator & PPParserVisitor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 98
diff changeset
    37
ea95f0757386 Added PPCompositeParserGenerator & PPParserVisitor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 98
diff changeset
    38
productions
ea95f0757386 Added PPCompositeParserGenerator & PPParserVisitor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 98
diff changeset
    39
    ^ productions
98
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
! !
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
!XBGFParser methodsFor:'parsing'!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
parse: aStringOrStreamOrFilename
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
    | doc |
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
    doc := XML::XMLParser 
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
                processDocumentStream:aStringOrStreamOrFilename readStream
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
                beforeScanDo:[:p|p validate: false]. 
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
    self processDocument: doc.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
    ^self
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
    "Created: / 10-01-2013 / 12:00:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
! !
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
!XBGFParser methodsFor:'processing'!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
processDocument: doc
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
    ( doc root / 'ns0:production' ) do:[:node|
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
        self processProduction: node
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
    ]
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
    "Created: / 10-01-2013 / 12:01:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
processExpression: node
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
    | expr parser |
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
    self assert: node children size == 1.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
    expr := node children anElement.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
    expr tag type = 'nonterminal' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
        ^self productionAt: expr characterData. 
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
    ].
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
    expr tag type = 'terminal' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
        ^PPLiteralSequenceParser on: expr characterData. 
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
    ].
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
    expr tag type = 'optional' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
        ^PPOptionalParser on: (self processExpression: (expr / 'ns0:expression') anElement)  
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
    ].
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
    expr tag type = 'any' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
        ^#any asParser  
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
    ].
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
    expr tag type = 'epsilon' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
        ^nil asParser  
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
    ].
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
    expr tag type = 'sequence' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
        parser := PPSequenceParser new
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
    ] ifFalse:[expr tag type = 'choice' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
        parser := PPChoiceParser new
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
    ] ifFalse:[expr tag type = 'star' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
        parser := PPRepeatingParser new setMin: 0 max: SmallInteger maxVal.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
        parser setParser: (self processExpression: (expr / 'ns0:expression') anElement).
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
        ^parser
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
    ] ifFalse:[expr tag type = 'plus' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
        parser := PPRepeatingParser new setMin: 1 max: SmallInteger maxVal.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
        parser setParser: (self processExpression: (expr / 'ns0:expression') anElement).
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
        ^parser
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
    ] ifFalse:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
        self error: 'Unknown expression: ', expr tag type
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
    ]]]].
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
    parser setParsers:
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
        ((expr / 'ns0:expression') collect:[:e|self processExpression: e]).
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
    ^parser
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
    "Created: / 10-01-2013 / 12:05:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
processProduction: node
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
    | name prod |
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
    name := (node / 'nonterminal') characterData.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
    prod := self productionAt: name.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
    self assert: (node / 'ns0:expression') size == 1.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
    prod def: (self processExpression: (node / 'ns0:expression') anElement)
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
    "Created: / 10-01-2013 / 12:01:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
! !
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
!XBGFParser class methodsFor:'documentation'!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
version
103
ea95f0757386 Added PPCompositeParserGenerator & PPParserVisitor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 98
diff changeset
   134
    ^ '$Header: /cvs/stx/stx/goodies/petitparser/devtools/XBGFParser.st,v 1.2 2013-01-10 13:22:58 vrany Exp $'
98
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
version_CVS
103
ea95f0757386 Added PPCompositeParserGenerator & PPParserVisitor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 98
diff changeset
   138
    ^ '$Header: /cvs/stx/stx/goodies/petitparser/devtools/XBGFParser.st,v 1.2 2013-01-10 13:22:58 vrany Exp $'
98
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
! !