diff options
Diffstat (limited to 'runtime/ObjC/Framework/examples/simplecTreeParser/main.m')
-rw-r--r-- | runtime/ObjC/Framework/examples/simplecTreeParser/main.m | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/runtime/ObjC/Framework/examples/simplecTreeParser/main.m b/runtime/ObjC/Framework/examples/simplecTreeParser/main.m new file mode 100644 index 0000000..f735ac3 --- /dev/null +++ b/runtime/ObjC/Framework/examples/simplecTreeParser/main.m @@ -0,0 +1,84 @@ +#import <Cocoa/Cocoa.h> +#import "antlr3.h" +#import "SimpleCLexer.h" +#import "SimpleCParser.h" +#import "SimpleCWalker.h" +#import "stdio.h" +#include <unistd.h> + +int main(int argc, const char * argv[]) { + NSError *anError; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + char *inp = "/Users/acondit/source/antlr3/acondit_localhost/code/antlr/antlr3-main/runtime/ObjC/Framework/examples/simplecTreeParser/input"; + +/* + if (argc < 2) { + NSLog(@"provide the input file, please"); + return 1; + } + */ + + // simply read in the input file in one gulp + NSString *string = [NSString stringWithContentsOfFile:[NSString stringWithCString:inp encoding:NSASCIIStringEncoding] encoding:NSASCIIStringEncoding error:&anError]; + NSLog(@"input is : %@", string); + + // create a stream over the input, so the lexer can seek back and forth, but don't copy the string, + // as we make sure it will not go away. + // If the string would be coming from a volatile source, say a text field, we could opt to copy the string. + // That way we could do the parsing in a different thread, and still let the user edit the original string. + // But here we do it the simple way. + ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:string]; + + // Actually create the lexer feeding of the character stream. + SimpleCLexer *lexer = [SimpleCLexer newSimpleCLexerWithCharStream:stream]; + + // For fun, you could print all tokens the lexer recognized, but we can only do it once. After that + // we would need to reset the lexer, and lex again. +// id<ANTLRToken> currentToken; +// while ((currentToken = [lexer nextToken]) && [currentToken type] != ANTLRTokenTypeEOF) { +// NSLog(@"%@", currentToken); +// } +// [lexer reset]; + + // Since the parser needs to scan back and forth over the tokens, we put them into a stream, too. + ANTLRCommonTokenStream *tokenStream = [ANTLRCommonTokenStream newANTLRCommonTokenStreamWithTokenSource:lexer]; + + // Construct a parser and feed it the token stream. + SimpleCParser *parser = [[SimpleCParser alloc] initWithTokenStream:tokenStream]; + + // We start the parsing process by calling a parser rule. In theory you can call any parser rule here, + // but it obviously has to match the input token stream. Otherwise parsing would fail. + // Also watch out for internal dependencies in your grammar (e.g. you use a symbol table that's only + // initialized when you call a specific parser rule). + // This is a simple example, so we just call the top-most rule 'program'. + // Since we want to parse the AST the parser builds, we just ask the returned object for that. + ANTLRCommonTree *program_tree = [[parser program] getTree]; + + NSLog(@"Reached end of first parse\n"); + // Print the matched tree as a Lisp-style string + NSLog(@"tree: %@", [program_tree treeDescription]); + + // Create a new tree node stream that's feeding off of the root node (thus seeing the whole tree) + ANTLRCommonTreeNodeStream *treeStream = [ANTLRCommonTreeNodeStream newANTLRCommonTreeNodeStream:program_tree]; + // tell the TreeNodeStream where the tokens originally came from, so we can retrieve arbitrary tokens and their text. + [treeStream setTokenStream:tokenStream]; + + // Create the treeparser instance, passing it the stream of nodes + SimpleCWalker *walker = [[SimpleCWalker alloc] initWithStream:treeStream]; + // As with parsers, you can invoke any treeparser rule here. + [walker program]; + + // Whew, done. Release everything that we are responsible for. + [lexer release]; + [stream release]; + [tokenStream release]; + [parser release]; + [treeStream release]; + [walker release]; + + [pool release]; + + // use this for ObjectAlloc on Tiger + //while(1) sleep(5); + return 0; +}
\ No newline at end of file |