Extending simple ANTLR grammar to support input variables

前端 未结 2 1952
挽巷
挽巷 2020-12-07 21:46

I\'m still on my quest for a really simple language and I know now that there are none. So I\'m writing one myself using ANTLR3.

I found a really great example in t

2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-07 21:52

    Bah, took the time to implement this so might as well post it, even though I was beat to the punch :)

    In the grammar below I have implemented the format of variable assigning you were looking to do.

    grammar Exp;
    
    
    
    eval returns [double value]
    scope
    {
        java.util.Hashtable varMap; 
    }
    @init
    {
        $eval::varMap = new java.util.Hashtable();
    }
    :    exp=additionExp {$value = $exp.value;}
        | varList
    ;
    
    additionExp returns [double value]
        :    m1=multiplyExp       {$value =  $m1.value;} 
             ( '+' m2=multiplyExp {$value += $m2.value;} 
             | '-' m2=multiplyExp {$value -= $m2.value;}
             )* 
        ;
    
    multiplyExp returns [double value]
        :    a1=atomExp       {$value =  $a1.value;}
             ( '*' a2=atomExp {$value *= $a2.value;} 
             | '/' a2=atomExp {$value /= $a2.value;}
             )* 
        ;
    
    atomExp returns [double value]
        :    n=Number                {$value = Double.parseDouble($n.text);}
        |    v=ID            {$value = $eval::varMap.get($v);}
        |    '(' exp=additionExp ')' {$value = $exp.value;}
        ;
    
    varList
        :   
        OPEN_BRACE assignVar (COMMA assignVar)+ CLOSE_BRACE
        ;
    
    assignVar
        :QUOTE var=ID n=Number QUOTE COLON { $eval::varMap.put($var, $n); }
        ;
    
    
    Number
        :    ('0'..'9')+ ('.' ('0'..'9')+)?
        ;
    
    WS  
        :   (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;}
        ;
    
    
    
    fragment LETTER: LOWER | UPPER;
    fragment LOWER: 'a'..'z';
    fragment UPPER: 'A'..'Z';
    
    OPEN_BRACE
        :   '{'
        ;
    
    CLOSE_BRACE
        :   '}'
        ;
    
    COLON   : ';';
    COMMA   :   ',';
    
    QUOTE   :   '"';
    
    ID
    : LETTER*;
    

提交回复
热议问题