2012-02-13 48 views
6

Có ai biết nếu có một số hướng dẫn và/hoặc ví dụ về việc sử dụng GNU Bison với Java qua mạng. Tôi đã tìm kiếm qua mạng. Nhưng tôi không tìm được gì cả. Tôi đã cố gắng để thực hiện một ví dụ nhưng tôi không thể biên dịch nó (kể từ khi tôi cần một lexer cũng). Dưới đây là ví dụ của tôi:Ví dụ về Bison java

%{ 
    static void main(String[] args) { 
    yyparse(); 
    } 
%} 

%union { 
    int  number; 
    char operator; 
} 

%language "Java" 

%token<number> NUMBER 
%token<operator> OPERATOR 

%type <number> exp 

%left OPERATOR 
%% 

input 
    : /* Empty string */ 
    | exp { System.out.print("Result >> " + $1); } 
    ; 

exp 
    : NUMBER 
    | exp OPERATOR exp { 
     switch($2) { 
      case '+': $$ = $1 + $3; break; 
      case '-': $$ = $1 - $3; break; 
      case '*': $$ = $1 * $3; break; 
      case '/': $$ = $1/$3; break; 
     } 
    } 

%% 

Bất kỳ trợ giúp sẽ được đánh giá cao!

+0

Không phải câu hỏi trực tiếp của bạn, nhưng tôi cảm thấy có nghĩa vụ đề xuất ANTLR! http://www.antlr.org/ –

Trả lời

10

Thật không may, hầu như tất cả các ví dụ công khai cho trình tạo Java của Bison đều được ẩn trong các bộ kiểm tra. Nếu bạn thích mạo hiểm, sau ./configure && make làm make check TESTSUITEFLAGS="-d -k java". Thao tác này sẽ chạy tất cả các kiểm tra với từ khóa (-k) "Java" và không xóa các thư mục hộp cát sau khi kiểm tra thành công (-d) để bạn nhận được bên dưới tests/testsuite.dir một loạt các thư mục với ngữ pháp, mã nguồn Java và các lớp được biên dịch. Một ví dụ từ Bison 2.5:

/* Infix notation calculator--calc */ 
%language "Java" 
%name-prefix "Calc" 
%define parser_class_name "Calc" 
%define public 


%code { 

    public static void main (String args[]) throws IOException 
    { 
    CalcLexer l = new CalcLexer (System.in); 
    Calc p = new Calc (l); 
    p.parse(); 
    } 

} 

%code imports { 
    import java.io.StreamTokenizer; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 
    import java.io.Reader; 
    import java.io.IOException; 
} 

/* Bison Declarations */ 
%token <Integer> NUM "number" 
%type <Integer> exp 

%nonassoc '=' /* comparison   */ 
%left '-' '+' 
%left '*' '/' 
%left NEG  /* negation--unary minus */ 
%right '^' /* exponentiation  */ 

/* Grammar follows */ 
%% 
input: 
    line 
| input line 
; 

line: 
    '\n' 
| exp '\n' 
| error '\n' 
; 

exp: 
    NUM    { $$ = $1;            } 
| exp '=' exp 
    { 
    if ($1.intValue() != $3.intValue()) 
     yyerror ("calc: error: " + $1 + " != " + $3); 
    } 
| exp '+' exp  { $$ = new Integer ($1.intValue() + $3.intValue()); } 
| exp '-' exp  { $$ = new Integer ($1.intValue() - $3.intValue()); } 
| exp '*' exp  { $$ = new Integer ($1.intValue() * $3.intValue()); } 
| exp '/' exp  { $$ = new Integer ($1.intValue()/$3.intValue()); } 
| '-' exp %prec NEG { $$ = new Integer (-$2.intValue());     } 
| exp '^' exp  { $$ = new Integer ((int) 
             Math.pow ($1.intValue(), 
                $3.intValue()));  } 
| '(' exp ')'  { $$ = $2;            } 
| '(' error ')'  { $$ = new Integer (1111);        } 
| '!'    { $$ = new Integer (0); return YYERROR;    } 
| '-' error   { $$ = new Integer (0); return YYERROR;    } 
; 


%% 
class CalcLexer implements Calc.Lexer { 

    StreamTokenizer st; 

    public CalcLexer (InputStream is) 
    { 
    st = new StreamTokenizer (new InputStreamReader (is)); 
    st.resetSyntax(); 
    st.eolIsSignificant (true); 
    st.whitespaceChars (9, 9); 
    st.whitespaceChars (32, 32); 
    st.wordChars (48, 57); 
    } 


    public void yyerror (String s) 
    { 
    System.err.println (s); 
    } 


    Integer yylval; 

    public Object getLVal() { 
    return yylval; 
    } 

    public int yylex() throws IOException { 
    int ttype = st.nextToken(); 

    if (ttype == st.TT_EOF) 
     return Calc.EOF; 

    else if (ttype == st.TT_EOL) 
     { 

     return (int) '\n'; 
     } 

    else if (ttype == st.TT_WORD) 
     { 
     yylval = new Integer (st.sval); 
     return Calc.NUM; 
     } 

    else 
     return st.ttype; 
    } 



} 


class Position { 
    public int line; 
    public int token; 

    public Position() 
    { 
    line = 0; 
    token = 0; 
    } 

    public Position (int l, int t) 
    { 
    line = l; 
    token = t; 
    } 

    public boolean equals (Position l) 
    { 
    return l.line == line && l.token == token; 
    } 

    public String toString() 
    { 
    return Integer.toString (line) + "." + Integer.toString(token); 
    } 

    public int lineno() 
    { 
    return line; 
    } 

    public int token() 
    { 
    return token; 
    } 
} 
+0

Cảm ơn rất nhiều, tôi sẽ đi sâu vào bộ kiểm tra bò rừng bizon để tìm hiểu thêm! – TheHube

+0

Tôi nhận được một java.lang.ClassNotFoundException mỗi khi tôi cố gắng chạy tệp Calc.java được tạo ra bởi điều này. Bạn có biết tại sao đó sẽ là? Không có số dòng nào trong nhật ký lỗi. – rgbrgb

+0

Bạn có thể đăng báo cáo của mình lên [email protected] không? Thật khó để chẩn đoán lỗi trong phần nhận xét. –