ANTLR: AST eval проблемы - PullRequest
       3

ANTLR: AST eval проблемы

0 голосов
/ 09 октября 2011

Алло,
Я хотел бы оценить созданное мной AST.
Я написал грамматику, генерирующую AST, и теперь я пытаюсь написать грамматику для оценки этого дерева.Вот моя грамматика:

tree grammar XHTML2CSVTree;

options {
    tokenVocab=XHTML2CSV;
    ASTLabelType=CommonTree;
}

@members {
                // variables and methods to be included in the java file generated
}

/*------------------------------------------------------------------
 * TREE RULES
 *------------------------------------------------------------------*/

// example
tableau returns [String csv]
    : ^(TABLEAU {String retour="";}(l=ligne{retour += $l.csv;})* {System.out.println(retour);})
    ;

ligne returns [String csv] 
    : ^(LIGNE {String ret="";}(c=cellule{ret += $c.csv;})+)
    ;

cellule returns [String csv]    
    : ^(CELLULE s=CHAINE){ $csv = $s.text;}
    ;

А вот грамматика построения AST:

grammar XHTML2CSV;

options {
    output=AST;
    ASTLabelType=CommonTree;
}

tokens {
    CELLULE;
    LIGNE;
    TABLEAU;
    CELLULEG    =  '<td>';                                                  // simple lexemes
    CELLULED    =  '</td>';
    DEBUTCOL    =  '<tr>';
    FINCOL      =  '</tr>';
    DTAB        =  '<table';
    FTAB        =  '>';
    FINTAB      =  '</table>';  

                                // anonymous tokens (usefull to give meaningfull name to AST labels)
                    // simple lexemes
}

@members {
                                                // variables and methods to be included in the java file generated
}

/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/
tableau
    : DTAB STAB* FTAB ligne* FINTAB -> ^(TABLEAU ligne*)
    ;

ligne 
    : DEBUTCOL cellule+ FINCOL -> ^(LIGNE cellule+)
    ;

cellule
    : CELLULEG CHAINE CELLULED -> ^(CELLULE CHAINE)
    ;           

/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/
STAB    
    :    ' '.*'=\"'.*'\"'
    ;   

WS
     : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ {$channel = HIDDEN;}
     ;                                                              // skip white spaces

CHAINE  :  (~('\"' | ',' | '\n' | '<' | '>'))+
    ;   

                    // complex lexemes

XHTML2CSV.g работает, я могу видеть AST, сгенерированный в ANTLRworks, но я не могу разобрать этот ASTсгенерированный код CSV.Я получаю ошибки:

XHTML2CSVTree.java:144: ';' expected
            match(input, Token.DOWN, null); 
                 ^
XHTML2CSVTree.java:144: not a statement
            match(input, Token.DOWN, null); 
                  ^
XHTML2CSVTree.java:144: ';' expected
            match(input, Token.DOWN, null); 
                       ^
XHTML2CSVTree.java:144: not a statement
            match(input, Token.DOWN, null); 
                              ^
XHTML2CSVTree.java:144: ';' expected
            match(input, Token.DOWN, null); 
                               ^

5 ошибок

Если кто-то может мне помочь,
Спасибо.

ЭО

Редактировать:
Мой основной класс выглядит так:

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.tree.CommonTreeNodeStream;
import org.antlr.runtime.tree.Tree;

public class Main {
   public static void main(String args[]) throws Exception {


      try {
          XHTML2CSVLexer lex = new XHTML2CSVLexer(new ANTLRFileStream(args[0]));    // create lexer to read the file specified from command line (i.e., first argument, e.g., java Main test1.xhtml)
          CommonTokenStream tokens = new CommonTokenStream(lex);                    // transform it into a token stream
          XHTML2CSVParser parser = new XHTML2CSVParser(tokens);                     // create the parser that reads from the token stream

          Tree t = (Tree) parser.cellule().tree;                                // (try to) parse a given rule specified in the parser file, e.g., my_main_rule


           CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);                // transform it into a common data structure readable by the tree pattern
           nodes.setTokenStream(tokens);                                            // declare which token to use (i.e., labels of the nodes defined in the parser, mainly anonymous tokens)
           XHTML2CSVTree tparser = new XHTML2CSVTree(nodes);                        // instantiate the tree pattern
           System.out.println(tparser.cellule());                                                   // apply patterns
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

1 Ответ

0 голосов
/ 09 октября 2011

Правило ligne в вашей древовидной грамматике:

ligne returns [String csv] 
  : ^(LIGNE {Sting ret="";r}(c=cellule{ret += $c.csv;})+)
  ; //         ^          ^ 
    //         |          |
    // problem 1, problem 2

имеет 2 проблемы:

  1. содержит Sting там, где должно быть String;
  2. есть завершающий r, который портит ваш пользовательский код Java.

Должно быть:

ligne returns [String csv] 
  : ^(LIGNE {String ret="";}(c=cellule{ret += $c.csv;})+)
  ;

EDIT

Если я сгенерирую лексер и парсер (1), сгенерирую обходчик дерева (2), скомпилирую все исходные файлы .java (3) и запустим основной класс (4):

java -cp antlr-3.3.jar org.antlr.Tool XHTML2CSV.g
java -cp antlr-3.3.jar org.antlr.Tool XHTML2CSVTree.g
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar Main test.txt

на консоль выводится следующее:

table data

, где файл test.txt содержит:

<td>table data</td>

Так что я не вижу никаких проблем. Возможно, вы пытаетесь разобрать <table>? Это может пойти не так, так как ваш анализатор и обходчик дерева вызывают правило cellule, а не правило tableau.

...