1
1
import string
2
2
3
3
from pyparsing import (
4
- Literal , White , Word , alphanums , CharsNotIn , Forward , Group ,
5
- Optional , OneOrMore , ZeroOrMore , pythonStyleComment )
4
+ Literal , White , Word , alphanums , CharsNotIn , Forward , Group , SkipTo ,
5
+ LineEnd , Optional , OneOrMore , ZeroOrMore , pythonStyleComment )
6
6
7
7
8
8
class NginxParser (object ):
@@ -17,18 +17,30 @@ class NginxParser(object):
17
17
space = White ().suppress ()
18
18
key = Word (alphanums + "_/" )
19
19
value = CharsNotIn ("{};," )
20
+ value2 = CharsNotIn (";" )
20
21
location = CharsNotIn ("{};," + string .whitespace )
22
+ ifword = Literal ("if" )
23
+ setword = Literal ("set" )
21
24
# modifier for location uri [ = | ~ | ~* | ^~ ]
22
25
modifier = Literal ("=" ) | Literal ("~*" ) | Literal ("~" ) | Literal ("^~" )
23
26
24
27
# rules
25
28
assignment = (key + Optional (space + value ) + semicolon )
29
+ setblock = (setword + OneOrMore (space + value2 ) + semicolon )
26
30
block = Forward ()
31
+ ifblock = Forward ()
32
+ subblock = ZeroOrMore (Group (assignment ) | block | ifblock | setblock )
33
+ ifblock = (
34
+ ifword
35
+ + SkipTo ('{' )
36
+ + left_bracket
37
+ + subblock
38
+ + right_bracket )
27
39
28
40
block << Group (
29
41
Group (key + Optional (space + modifier ) + Optional (space + location ))
30
42
+ left_bracket
31
- + Group (ZeroOrMore (Group (assignment ) | block ))
43
+ + Group (ZeroOrMore (Group (assignment ) | block | ifblock | setblock ))
32
44
+ right_bracket )
33
45
34
46
script = OneOrMore (Group (assignment ) | block ).ignore (pythonStyleComment )
0 commit comments