devtools/XBGFParser.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 10 Jan 2013 13:29:16 +0100
changeset 98 8e5e20ea96d4
child 103 ea95f0757386
permissions -rw-r--r--
initial checkin
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>"
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
! !
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
!XBGFParser methodsFor:'parsing'!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
parse: aStringOrStreamOrFilename
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
    | doc |
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
    doc := XML::XMLParser 
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
                processDocumentStream:aStringOrStreamOrFilename readStream
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
                beforeScanDo:[:p|p validate: false]. 
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
    self processDocument: doc.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
    ^self
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
    "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
    50
! !
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
!XBGFParser methodsFor:'processing'!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
processDocument: doc
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
    ( doc root / 'ns0:production' ) do:[:node|
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
        self processProduction: node
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
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
    "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
    60
!
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
processExpression: node
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
    | expr parser |
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
    self assert: node children size == 1.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
    expr := node children anElement.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
    expr tag type = 'nonterminal' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
        ^self productionAt: expr characterData. 
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
    ].
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 = 'terminal' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
        ^PPLiteralSequenceParser on: 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 = 'optional' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
        ^PPOptionalParser on: (self processExpression: (expr / 'ns0:expression') anElement)  
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 = 'any' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
        ^#any asParser  
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 = 'epsilon' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
        ^nil 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
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
    expr tag type = 'sequence' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
        parser := PPSequenceParser new
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
    ] ifFalse:[expr tag type = 'choice' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
        parser := PPChoiceParser new
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
    ] ifFalse:[expr tag type = 'star' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
        parser := PPRepeatingParser new setMin: 0 max: SmallInteger maxVal.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
        parser setParser: (self processExpression: (expr / 'ns0:expression') anElement).
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
        ^parser
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
    ] ifFalse:[expr tag type = 'plus' ifTrue:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
        parser := PPRepeatingParser new setMin: 1 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:[
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
        self error: 'Unknown expression: ', expr tag type
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
    ]]]].
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
    parser setParsers:
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
        ((expr / 'ns0:expression') collect:[:e|self processExpression: e]).
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
    ^parser
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
    "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
   111
!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
processProduction: node
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
    | name prod |
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
    name := (node / 'nonterminal') characterData.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
    prod := self productionAt: name.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
    self assert: (node / 'ns0:expression') size == 1.
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
    prod def: (self processExpression: (node / 'ns0:expression') anElement)
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
    "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
   125
! !
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
!XBGFParser class methodsFor:'documentation'!
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
version
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
    ^ '$Header: /cvs/stx/stx/goodies/petitparser/devtools/XBGFParser.st,v 1.1 2013-01-10 12:29:16 vrany Exp $'
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
!
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_CVS
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
    ^ '$Header: /cvs/stx/stx/goodies/petitparser/devtools/XBGFParser.st,v 1.1 2013-01-10 12:29:16 vrany Exp $'
8e5e20ea96d4 initial checkin
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
! !