summaryrefslogtreecommitdiff
path: root/tools/dfagen/dfagen/parser.g
blob: 62f9f4d13787c49b249656c5647939a59d9e3e93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from dfagen.automaton import *

%%

parser AutomatonParser:
    ignore:		"(#.*?)?\n"
    token EOF:		"$"
    token COMMENTS:	"  .+?\n"
    token STATE:	"\w+"
    token EVENT:	"\w([\w ]*\w)?"
    token QUALIFIER:	"\w([\w ]*\w)?"
    token ATITLE:	".*?\n"

    rule automaton:	ATITLE		{{ a = Automaton (ATITLE.strip ()) }}
			( comments	{{ a.comments = comments }}
				) ?
			"States:\n"
			( statedef	{{ a.add_state (statedef) }}
				) *
			"Events:\n"
			( eventdef	{{ a.add_event (eventdef) }}
				) *
			( transdef<<a>>
				) *
			EOF		{{ return a }}
    
    rule statedef:	" " STATE	{{ s = State (STATE) }}
			"\n"
			( comments	{{ s.comments = comments }}
				) ?
					{{ return s }}
    
    rule eventdef:	" " EVENT	{{ e = Event (EVENT) }}
			"\n"
			( comments	{{ e.comments = comments }}
				) ?
					{{ return e }}

    rule transdef<<a>>:	transsl<<a>>
			( trans<<a>>	{{ for s in transsl: s.add_branch (trans) }}
				) *

    rule transsl<<a>>:			{{ sl = [ ] }}
			STATE		{{ sl.append (a.states[STATE]) }}
			( ",\s*" STATE	{{ sl.append (a.states[STATE]) }}
				) *
			":\n"		{{ return sl }}

    rule trans<<a>>:	" " EVENT	{{ t = TransitionBranch (a.events[EVENT]) }}
			( ":\s*" QUALIFIER {{ t.name = QUALIFIER }}
				) ?
			"\s*->\s*"
			( STATE		{{ t.to = a.states[STATE] }}
				| "\\." )
			( comments	{{ t.comments = comments }}
				) ?
					{{ return t }}

    rule comments:	COMMENTS	{{ c = COMMENTS.strip () }}
			( COMMENTS	{{ c += '\n' + COMMENTS.strip () }}
				) *	{{ return c }}