aboutsummaryrefslogtreecommitdiff
blob: 3da4ecbde5159dd8014775202f051eabc6e08b76 (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
from ply import lex
from ply import yacc

def parseif(ifoptions):
    optstr = ""
    for option in ifoptions:
        optstr += option + " "

    tokens = (
            "NOT",
            "AND",
            "OR",
            "EQ",
            "NEQ",
            "NONZERO",
            "SEMICOL",
            "LBRAC",
            "RPRAC",
            "OPT",
            "TEST",
            )

    def t_TEST(t):
        r"test"
        return t

    def t_AND(t):
        r"(\-a|\&\&)"
        return t

    def t_OR(t):
        r"(\-o|\|\|)"
        return t

    def t_EQ(t):
        r"="
        return t

    def t_NEQ(t):
        r"\!="
        return t

    def t_NOT(t):
        r"\!"
        return t

    def t_NONZERO(t):
        r"\-n"
        return t

    def t_SEMICOL(t):
        r";"
        pass

    def t_LBRAC(t):
        r"\{"
        return t

    def t_RPRAC(t):
        r"\}"
        return t

    def t_space(t):
        r"[ \t\n]"
        pass

    def t_quote(t):
        r"[\"\']"
        pass

    def t_OPT(t):
        r"[^ \t\n;\"\']+"
        return t

    def t_ANY_error(t):
        print("Illegal character '%s'" % t.value[0],t.lexer.lineno)
        t.lexer.skip(1)

    lexer = lex.lex()

    #lexer.input(optstr)
    #for tok in lexer:
    #    print(tok)

    #YACC
    #Add more cases!

    def p_exp(p):
        """
        exp : NOT TEST expopt
            | TEST expopt
        """
        if len(p) == 4:
            newlst = []
            while len(newlst) < len(p[3]):
                if p[3][len(newlst)+1][0] == "!":
                    newresult = p[3][len(newlst)+1][1:]
                else:
                    newresult = "!" + p[3][len(newlst)+1]

                newlst += [p[3][len(newlst)],newresult]

            p[0] = newlst

        else:
            p[0] = p[2]

    def p_expopt(p):
        """
        expopt : expopt AND expopt
               | expopt OR expopt
        """
        if p[2] == "-a":
            p[0] = p[1] + p[3]
        else:  #come up with something better
            p[0] = p[1] + p[3]

    def p_expopt2(p):
        """
        expopt : OPT EQ OPT
               | OPT NEQ OPT
               | NONZERO OPT
               | OPT
        """
        if p[2] == "=":
            varstr = p[1].split("$")
            p[0] = [varstr[1],p[3][len(varstr[0]):]]
            #[VARIABLEname,value to pass test]

        elif p[2] == "!=":
            varstr = p[1].split("$")
            p[0] = [varstr[1],"!" + p[3][len(varstr[0]):]]

        else:
            varstr = p[len(p)-1].split("$")[1]
            p[0] = [varstr, "!"] #req that the variable is nonzero to be True

    def p_error(p):
        print("syntax error at '%s'" % p.type,p.value)
        pass

    yacc.yacc()
    return yacc.parse(optstr)