[antlr-interest] Parser --> TreeParser: help with bigger exampleplease?

Jim Idle jimi at temporal-wave.com
Thu May 17 12:07:20 PDT 2007


Tim,

 

The best way is to plug this grammar in to AntlrWorks and throw small
snippets of input at it. Then you will get a graphical view of the trees
produced and it should make more sense to you.

 

Jim

 

From: antlr-interest-bounces at antlr.org
[mailto:antlr-interest-bounces at antlr.org] On Behalf Of Tim Clark
Sent: Thursday, May 17, 2007 12:02 PM
To: antlr-interest
Subject: [antlr-interest] Parser --> TreeParser: help with bigger
exampleplease?

 

Hi All
The book gives a rather simple (and easy to understand) example of the
step from the parser to the tree parser (for expressions). When it's a
lot more complicated (as below, for example) I'm a little stumped as to
how to do it. Any words of advice would be greatly appreciated.
Intuitively it's clear that one ends up with lists of simple things like
^('+' arg1 arg2) or ^('-' arg), but it's a bit mind-boggling when the
rules are so much more complicated. 

expr
    :
    assignExpr
    ;

assignExpr
    :
    condExpr (assignOp^ assignExpr)?
    ;

assignOp
    :
    ASSIGN | PLUS_ASSIGN | MINUS_ASSIGN | STAR_ASSIGN | DIV_ASSIGN
    | MOD_ASSIGN | CAT_ASSIGN | OR_ASSIGN | AND_ASSIGN | XOR_ASSIGN |
LCAT_ASSIGN
    ;

condExpr
    :
    condOrExpr (QUESTION^ expr COLON expr)?
    ;
    
condOrExpr
    :
    condAndExpr (LOGICAL_OR^ condAndExpr)*    
    ;

condAndExpr
    :
    eqExpr (LOGICAL_AND^ eqExpr)*
    ;

eqExpr
    :
    relExpr ((IS_EQUAL^ | NOT_EQUAL^) relExpr)*
    ;

relExpr
    :
    incOrExpr ((LESS_THAN^ | GREATER_THAN^ | LESS_OR_EQUAL^ |
GREATER_OR_EQUAL^) incOrExpr)* 
    ;

incOrExpr
    :
    excOrExpr (LINE^ excOrExpr)*
    ;

excOrExpr
    :
    andExpr (HAT^ andExpr)*
    ;

andExpr
    :
    shiftExpr (AMPER^ shiftExpr)*
    ;

shiftExpr
    :
    addExpr ((LSHIFT^ | RSHIFT^) addExpr)*
    ;

addExpr
    :
    multExpr ((PLUS^ | MINUS^ | CAT^ | LIST_CAT^) multExpr)*
    ;

multExpr
    :
    unaryExpr ((STAR^ | DIV^ | MOD^) unaryExpr)* 
    ;

unaryExpr
    :
    primaryExpr
    |
    negation
    |
    binaryComp
    |
    logicalNot
    |
    sizeOf
    ;

negation
    :
    NEGATE unaryExpr
    -> ^(NEG unaryExpr) 
    ;

binaryComp
    :
    COMPLEMENT unaryExpr
    -> ^(COMPL unaryExpr)
    ;

logicalNot
    :
    LOGICAL_NOT unaryExpr
    -> ^(NOT unaryExpr)
    ;

sizeOf
    : 
    SIZE unaryExpr
    -> ^(SIZEOF unaryExpr)
    ;

primaryExpr
options {backtrack=true;}
    :
    constant
    |
    ID
    |
    parenExpr
    |
    funcCall
    |
    listSelector 
    |
    listCons
    |
    mapCons
    |
    preInc
    |
    postInc
    |
    preDec
    |
    postDec
    ;

parenExpr
    :
    LPAREN! expr RPAREN!
    ;

exprList
    :
    expr (COMMA! expr)*
    |
    // Empty
    ;

funcCall
    :
    ID LPAREN exprList RPAREN
    -> ^(CALL ID exprList)
    ;

listCons
    :
    LBRAK exprList RBRAK 
    -> ^(LIST_CONS exprList)
    ;

listSelector
    :
    ID sliceList
    -> ^(LIST_SEL ID sliceList)
    ;

sliceList
    :
    listSlice (listSlice)*
    ;

listSlice 
    :
    LBRAK! expr RBRAK!
    ;

mapCons
    :
    '{{' keyValueList '}}'
    -> ^(MAP_CONS keyValueList)
    ;

keyValueList
    :
    keyValuePair (','! keyValuePair)* 
    |
    /*Empty*/
    ;
    
keyValuePair
    :
    e1=expr ':' e2=expr
    -> ^(KEY_VALUE_PAIR $e1 $e2)
    ;
    
preInc
    :
    (DPLUS listSelector) => DPLUS listSelector 
    -> ^(PRE_INC listSelector)
    |
    DPLUS ID
    -> ^(PRE_INC ID)
    ;

postInc
    :
    (listSelector DPLUS) => listSelector DPLUS
    -> ^(POST_INC listSelector)
    | 
    ID DPLUS
    -> ^(POST_INC ID)
    ;

preDec
    :
    (DMINUS listSelector) => DMINUS listSelector
    -> ^(PRE_DEC listSelector)
    |
    DMINUS ID
    -> ^(PRE_DEC ID) 
    ;

postDec
    :
    (listSelector DMINUS) => listSelector DMINUS
    -> ^(POST_DEC listSelector)
    |
    ID DMINUS
    -> ^(POST_DEC ID)
    ;

constant
    :
    STRING 
    |
    NUM_INT
    |
    NUM_FLOAT
    |
    'true'
    |
    'false'
    |
    'nil'
    ;

Tim

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20070517/796d7bc5/attachment-0001.html 


More information about the antlr-interest mailing list