grammar names;
options
{
language = C;
output = AST;
ASTLabelType=pANTLR3_BASE_TREE;
}
name: firstname lastname
| lastname COMMA^ firstname
;
COMMA
: ','
;
firstname
: ID;
lastname
: ID;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
// names.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "namesLexer.h"
#include "namesParser.h"
int parse(const char* pszInput);
int WalkTree(pANTLR3_BASE_TREE tree);
int _tmain(int argc, _TCHAR* argv[])
{
parse("Henry James");
parse("Henry, James");
return 0;
}
int parse(const char* pszInput)
{
pANTLR3_INPUT_STREAM input;
pnamesLexer lex;
pANTLR3_COMMON_TOKEN_STREAM tokens;
pnamesParser parser;
const char* pszName = "doodah";
size_t bufferSize = strlen(pszInput);
input = antlr3StringStreamNew(
(pANTLR3_UINT8)pszInput,
ANTLR3_ENC_8BIT,
bufferSize,
(pANTLR3_UINT8)pszName);
lex = namesLexerNew(input);
tokens = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lex));
parser = namesParserNew(tokens);
namesParser_name_return
r = parser->name(parser);
pANTLR3_BASE_TREE tree = r.tree;
int rr = WalkTree(tree);
parser->free(parser);
tokens->free(tokens);
lex->free(lex);
input->close(input);
return 1;
}
pANTLR3_BASE_TREE getChild(pANTLR3_BASE_TREE tree, unsigned i)
{
//assert(i < tree->getChildCount(tree));
return (pANTLR3_BASE_TREE) tree->getChild(tree, i);
}
const char* getText(pANTLR3_BASE_TREE tree)
{
return (const char*) tree->getText(tree)->chars;
}
int WalkTree(pANTLR3_BASE_TREE tree)
{
pANTLR3_COMMON_TOKEN tok = tree->getToken(tree);
if(tok)
{
pANTLR3_BASE_TREE ltree, rtree;
pANTLR3_BASE_TREE ptree;
const char* s = getText(tree);
switch(tok->type)
{
}
}
else
{
int k = tree->getChildCount(tree);
int r = 0;
for(int i = 0; i < k; i++)
{
r = WalkTree(getChild(tree, i));
}
return r;
}
return 0;
}
firstname
: ID { $ID->user1='F'; };
lastname
: ID { $ID->user1='L'; };
Looking at the AST, I see IDs and COMMAs. When I encounter an ID in the tree, how would I tell if its from the firstname rule or the lastname rule?
--
You received this message because you are subscribed to the Google Groups "antlr-discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to antlr-discussi...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
You don't need parser rule context. You use rewrites to disambiguate the tree. See my answer.
Looking at the AST, I see IDs and COMMAs. When I encounter an ID in the tree, how would I tell if its from the firstname rule or the lastname rule?AFAIK you can't. You only get lexer tokens in your tree, no parser rules.I'd love to get a "parser rule path" for each token that was taken to match it. This way implementing code completion should be a lot simpler.
grammar names;
options
{
language = C;
output = AST;
ASTLabelType=pANTLR3_BASE_TREE;
}
//name: firstname lastname
// | lastname COMMA^ firstname
// ;
//firstname
// : ID;
//lastname
// : ID;
tokens { NAME; }
name : ^(NAME ID ID) // first last
;
NAME:
( first=ID last=ID
| last=ID COMMA first=ID)
-> ^(NAME $first $last)
;
COMMA : ','
;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
error(10): internal error : C:\Users\jspindler\Projects\Parser research\cpp-examples\names\names.g : java.lang.NullPointerException
1> org.antlr.grammar.v3.DefineGrammarItemsWalker.rewrite_atom(DefineGrammarItemsWalker.java:4510)
1> org.antlr.grammar.v3.DefineGrammarItemsWalker.rewrite_tree(DefineGrammarItemsWalker.java:4438)
1> org.antlr.grammar.v3.DefineGrammarItemsWalker.rewrite_element(DefineGrammarItemsWalker.java:4325)
1> org.antlr.grammar.v3.DefineGrammarItemsWalker.rewrite_alternative(DefineGrammarItemsWalker.java:4198)
1> org.antlr.grammar.v3.DefineGrammarItemsWalker.rewrite(DefineGrammarItemsWalker.java:3959)
1> org.antlr.grammar.v3.DefineGrammarItemsWalker.block(DefineGrammarItemsWalker.java:1927)
1> org.antlr.grammar.v3.DefineGrammarItemsWalker.rule(DefineGrammarItemsWalker.java:1517)
1> org.antlr.grammar.v3.DefineGrammarItemsWalker.rules(DefineGrammarItemsWalker.java:1119)
1> org.antlr.grammar.v3.DefineGrammarItemsWalker.grammarSpec(DefineGrammarItemsWalker.java:591)
1> org.antlr.grammar.v3.DefineGrammarItemsWalker.grammar_(DefineGrammarItemsWalker.java:313)
1> org.antlr.tool.Grammar.defineGrammarSymbols(Grammar.java:791)
1> org.antlr.tool.CompositeGrammar.defineGrammarSymbols(CompositeGrammar.java:370)
1> org.antlr.Tool.process(Tool.java:506)
1> org.antlr.Tool.main(Tool.java:98)
You missed out the
tokens {NAME;}
Part of my post.
Jim
From: antlr-di...@googlegroups.com [mailto:antlr-di...@googlegroups.com] On Behalf Of Jeff Spindler
Sent: Tuesday, August 20, 2013 2:12 AM
To: antlr-di...@googlegroups.com