2010-03-31 12 views
2

J'essaie de traduire une grammaire de bison en ANTLR. La grammaire elle-même est assez simple chez les bisons, mais je ne trouve pas un moyen simple de le faire.Grammaire ANTLR de bison

Grammaire bison:

expr = expr or expr | expr and expr | (expr) 

Tout conseils/liens/pointeurs sont les bienvenus.

Merci, Iulian

Répondre

4

En ANTLR, vous ne pouvez pas créer de gauche règles récursives:

a : a b 
    ; 

récursion queue est très bien:

a : b a 
    ; 

Pour plus d'informations sur les règles récursives à gauche, voir ANTLR's Wiki.

Ainsi, votre exemple pourrait ressembler à:

parse 
    : expr+ EOF 
    ; 

expr 
    : orExpr 
    ; 

orExpr 
    : andExpr ('or' andExpr)* 
    ; 

andExpr 
    : atom ('and' atom)* 
    ; 

atom 
    : Boolean 
    | '(' expr ')' 
    ; 

Boolean 
    : 'true' 
    | 'false' 
    ; 

Voici une petite démo en Java:

grammar BoolExp; 

@members { 
    public static void main(String[] args) throws Exception { 
    if(args.length != 1) { 
     System.out.println("Usage:"); 
     System.out.println(" - Windows : java -cp .:antlr-3.2.jar BoolExpParser \"EXPRESSION\""); 
     System.out.println(" - *nix/MacOS : java -cp .;antlr-3.2.jar BoolExpParser \"EXPRESSION\""); 
     System.exit(0); 
    } 
    ANTLRStringStream in = new ANTLRStringStream(args[0]); 
    BoolExpLexer lexer = new BoolExpLexer(in); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    BoolExpParser parser = new BoolExpParser(tokens); 
    parser.parse(); 
    } 
} 

parse 
    : e=expr EOF {System.out.println($e.bool);} 
    ; 

expr returns [boolean bool] 
    : e=orExpr {$bool = $e.bool;} 
    ; 

orExpr returns [boolean bool] 
    : e1=andExpr  {$bool = $e1.bool;} 
    ('or' e2=andExpr {$bool = $bool || $e2.bool;} 
    )* 
    ; 

andExpr returns [boolean bool] 
    : e1=atom  {$bool = $e1.bool;} 
    ('and' e2=atom {$bool = $bool && $e2.bool;} 
    )* 
    ; 

atom returns [boolean bool] 
    : b=Boolean  {$bool = new Boolean($b.text).booleanValue();} 
    | '(' e=expr ')' {$bool = $e.bool;} 
    ; 

Boolean 
    : 'true' 
    | 'false' 
    ; 

Space 
    : (' ' | '\t' | '\n' | '\r') {skip();} 
    ; 

d'abord créer un analyseur (1), puis compiler lexer & tous les fichiers source (2). Enfin, exécutez la classe BoolExpParser (3).

// Windows & *nix/MacOS 
java -cp antlr-3.2.jar org.antlr.Tool BoolExp.g 
// Windows 
javac -cp .;antlr-3.2.jar *.java 

// *nix/MacOS 
javac -cp .:antlr-3.2.jar *.java 
// Windows 
java -cp .;antlr-3.2.jar BoolExpParser "false and true or true" 

// *nix/MacOS 
java -cp .:antlr-3.2.jar BoolExpParser "false and true or true" 

Terence Parr « s ANTLR reference est le livre sur ANTLR. Et Scott créé un excellent video tutorials sur ANTLR 3 (avec Eclipse).

+0

Merci beaucoup - ça me va bien. Pouvez-vous me suggérer un lien/livre où je peux lire plus à ce sujet? EDIT: le lien est bien; Merci encore. – INS

+1

J'ai mis à jour ma réponse avec un lien vers le Wiki et une recommandation de livre. Bon d'entendre ça t'a aidé. –

Questions connexes