ANTLR:AST评估问题

时间:2011-10-09 14:27:41

标签: java csv antlr abstract-syntax-tree

异体,
我想评估我生成的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有效,我可以看到ANTLRworks中生成的AST, 但是我不能解析这个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个错误

如果有人可以帮助我, 感谢。

EO

编辑:
我的主要课程如下:

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 :(得分:0)

你树语法中的ligne规则:

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

有两个问题:

  1. 它包含Sting,其中应为String;
  2. 有一个尾随的r搞乱了你的自定义Java代码。
  3. 应该是:

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

    修改

    如果我生成词法分析器和解析器(1),则生成树步行器(2),编译所有.java源文件(3)并运行Main类(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规则。