Mercurial > hg > expressionparser
comparison expr.py @ 11:e17a3464a0b9
get precedence from a list position vs magic constants
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Fri, 03 Jun 2011 10:51:36 -0700 |
parents | 15fb1081784f |
children | 835efd8acb04 |
comparison
equal
deleted
inserted
replaced
10:15fb1081784f | 11:e17a3464a0b9 |
---|---|
43 def nud(self, parser): | 43 def nud(self, parser): |
44 return self.value | 44 return self.value |
45 | 45 |
46 class eq_op_token(object): | 46 class eq_op_token(object): |
47 "==" | 47 "==" |
48 lbp = 20 | |
49 def led(self, parser, left): | 48 def led(self, parser, left): |
50 return left == parser.expression(self.lbp) | 49 return left == parser.expression(self.lbp) |
51 | 50 |
52 class neq_op_token(object): | 51 class neq_op_token(object): |
53 "!=" | 52 "!=" |
54 lbp = 20 | |
55 def led(self, parser, left): | 53 def led(self, parser, left): |
56 return left != parser.expression(self.lbp) | 54 return left != parser.expression(self.lbp) |
57 | 55 |
58 class and_op_token(object): | 56 class and_op_token(object): |
59 "&&" | 57 "&&" |
60 lbp = 11 | |
61 def led(self, parser, left): | 58 def led(self, parser, left): |
62 right = parser.expression(self.lbp) | 59 right = parser.expression(self.lbp) |
63 return left and right | 60 return left and right |
64 | 61 |
65 class or_op_token(object): | 62 class or_op_token(object): |
66 "||" | 63 "||" |
67 lbp = 10 | |
68 def led(self, parser, left): | 64 def led(self, parser, left): |
69 right = parser.expression(self.lbp) | 65 right = parser.expression(self.lbp) |
70 return left or right | 66 return left or right |
71 | 67 |
72 class lparen_token(object): | 68 class lparen_token(object): |
73 "(" | 69 "(" |
74 lbp = 50 | |
75 def nud(self, parser): | 70 def nud(self, parser): |
76 expr = parser.expression() | 71 expr = parser.expression() |
77 parser.advance(rparen_token) | 72 parser.advance(rparen_token) |
78 return expr | 73 return expr |
79 | 74 |
80 class rparen_token(object): | 75 class rparen_token(object): |
81 ")" | 76 ")" |
82 lbp = 0 | |
83 | 77 |
84 class end_token(object): | 78 class end_token(object): |
85 # lowest left binding power, always ends parsing | 79 """always ends parsing""" |
86 lbp = 0 | |
87 | 80 |
88 ### derived literal tokens | 81 ### derived literal tokens |
89 | 82 |
90 class bool_token(literal_token): | 83 class bool_token(literal_token): |
91 def __init__(self, value): | 84 def __init__(self, value): |
104 (or_op_token,), | 97 (or_op_token,), |
105 (and_op_token,), | 98 (and_op_token,), |
106 (eq_op_token, neq_op_token), | 99 (eq_op_token, neq_op_token), |
107 (lparen_token,), | 100 (lparen_token,), |
108 ] | 101 ] |
102 for index, rank in enumerate(precedence): | |
103 for token in rank: | |
104 token.lbp = index # lbp = lowest left binding power | |
109 | 105 |
110 class ParseError(Exception): | 106 class ParseError(Exception): |
111 """errror parsing conditional expression""" | 107 """errror parsing conditional expression""" |
112 | 108 |
113 class ExpressionParser(object): | 109 class ExpressionParser(object): |