Hi all, I'm trying to use the Python backend.  I wanted to start with something 
simple and I didn't see an example like this either in Parr's book or on the 
wiki.

So, suppose I just want to recognize a string with (uppercase) letters and 
numbers separated by a dot.  The parse function needs to return the letters and 
numbers separately, or else the value None if the expression doesn't parse.  
Below are how it might be done with regular expressions, and how I've tried to 
do it with ANTLR3 using the AST generator.

============== Regular expression example
import re

def parse(s):
    """Parse string s and return pair [letters, numbers]"""
    m = re.match("([A-Z]+)\\.([0-9]+)$", s)
    return (m.group(1), m.group(2)) if m else None

============== My ANTLR attempt: Example.g
grammar Example;

options {
        language=Python;
        output=AST;
        ASTLabelType=CommonTree;
}

@lexer::members {
def reportError(self, e):
   raise e
}
@members {
def mismatch(self, input, ttype, follow):
    raise MismatchedTokenException(ttype, input)

def recoverFromMismatchedSet(self, input, e, follow):
    raise e
}
@rulecatch {
except RecognitionException, e:
    raise
}

expr    :       LETTERS '.' NUMBERS EOF -> LETTERS NUMBERS;

LETTERS :       'A'..'Z'+ ;

NUMBERS :       '0'..'9'+;

============== My ANTLR attempt: example.py

import StringIO
import antlr3
import ExampleLexer, ExampleParser

def parse(s):
    """Parse string s and return pair [letters, numbers]"""
    stringio = StringIO.StringIO(s)
    char_stream = antlr3.ANTLRInputStream(stringio)
    lexer = ExampleLexer.ExampleLexer(char_stream)
    tokens = antlr3.CommonTokenStream(lexer)
    parser = ExampleParser.ExampleParser(tokens)
    try: expr = parser.expr()
    except antlr3.RecognitionException: return None
    return tuple(child.text for child in expr.tree.getChildren())

============== End code

So first, do I have the right basic idea here?  It seems to be getting pretty 
complicated and already into some undocumented stuff for a simple example.

Second, this example still doesn't really work, because it still matches 
strings like "3452EOUSNTHO.32423AOE" that it shouldn't.  Also, this solution is 
hard to package because the modules in the antlr3 runtime refer to other antlr3 
modules like "antlr3.streams" instead of just "streams" so I have to start 
messing with python's module path.  How can I fix this?

Thanks for any advise,
-- 
Ben


List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe: 
http://www.antlr.org/mailman/options/antlr-interest/your-email-address

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"il-antlr-interest" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/il-antlr-interest?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to