On Wed, Nov 22, 2006 at 11:17:52AM -0800, Bytter wrote: > Hi, > > I'm trying to construct a parser, but I'm stuck with some basic > stuff... For example, I want to match the following: > > letter = "A"..."Z" | "a"..."z" > literal = letter+ > include_bool := "+" | "-" > term = [include_bool] literal > > So I defined this as: > > literal = Word(alphas) > include_bool = Optional(oneOf("+ -")) > term = include_bool + literal + here means that you allow a space. You need to explicitly override this. Try:
term = Combine(include_bool + literal) > > The problem is that: > > term.parseString("+a") -> (['+', 'a'], {}) # OK > term.parseString("+ a") -> (['+', 'a'], {}) # KO. It shouldn't > recognize any token since I didn't said the SPACE was allowed between > include_bool and literal. > > Can anyone give me an hand here? > > Cheers! > > Hugo Ferreira > > BTW, the following is the complete grammar I'm trying to implement with > pyparsing: > > ## L ::= expr | expr L > ## expr ::= term | binary_expr > ## binary_expr ::= term " " binary_op " " term > ## binary_op ::= "*" | "OR" | "AND" > ## include_bool ::= "+" | "-" > ## term ::= ([include_bool] [modifier ":"] (literal | range)) | ("~" > literal) > ## modifier ::= (letter | "_")+ > ## literal ::= word | quoted_words > ## quoted_words ::= '"' word (" " word)* '"' > ## word ::= (letter | digit | "_")+ > ## number ::= digit+ > ## range ::= number (".." | "...") number > ## letter ::= "A"..."Z" | "a"..."z" > ## digit ::= "0"..."9" > > And this is where I got so far: > > word = Word(nums + alphas + "_") > binary_op = oneOf("* and or", caseless=True).setResultsName("operator") > include_bool = oneOf("+ -") > literal = (word | quotedString).setResultsName("literal") > modifier = Word(alphas + "_") > rng = Word(nums) + (Literal("..") | Literal("...")) + Word(nums) > term = ((Optional(include_bool) + Optional(modifier + ":") + (literal | > rng)) | ("~" + literal)).setResultsName("Term") > binary_expr = (term + binary_op + term).setResultsName("binary") > expr = (binary_expr | term).setResultsName("Expr") > L = OneOrMore(expr) > > > -- > GPG Fingerprint: B0D7 1249 447D F5BB 22C5 5B9B 078C 2615 504B 7B85 > > -- > http://mail.python.org/mailman/listinfo/python-list -- http://mail.python.org/mailman/listinfo/python-list