2010-11-10 51 views
0

我正在使用ANTLR來替換現有的(小)解析器。這裏是我試圖解析該文件的一個片段:爲什麼ANTLR沒有按照我的預期來認識這條規則?

Lurker 915236167 10 2 Bk cc b  b   1000 70 200 Jc Qs 
Lurker 915236237 10 1 Bc kf -  -   1130 10 0 
Lurker 915236302 10 10 c c  rc b   1120 110 305 6d Kd 
Lurker 915236381 10 9 c f  -  -   1315 20 0 
Lurker 915236425 10 8 cc f  -  -   1295 30 0 

這裏是Shared.g:

lexer grammar Shared; 


NICK 
    : LETTER (LETTER | NUMBER | SPECIAL)* 
    ; 

fragment 
LETTER 
    : 'A'..'Z' 
    | 'a'..'z' 
    | '_' 
    ; 

NUMBER 
    : ('0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9')+ 
    ; 

fragment 
SPECIAL 
    : ('-'|'^'|'{'|'}'|'|'|'['|']'|'`'|'\\') 
    ; 

WS 
    : (' ' 
     | '\t' 
     | '\r' 
     | '\n' 
     )+ 
    ; 

而且Pdb.g:

grammar Pdb; 
import Shared; 

@header{ 
import java.util.ArrayList; 
import java.sql.Connection; 
} 


@members{ 
    private Connection conn; 

    private StringBuilder currentExpr = new StringBuilder(500); 

    ArrayList<String> players = new ArrayList<String>(10); 

    public void setConn(Connection conn){ 
     this.conn = conn; 
    } 
} 

pdb 
    : line+ 
    ; 

line 
    @after{ 
     currentExpr.append("execute player_handplan("); 
     currentExpr.append($nick.text); 
     currentExpr.append(", to_timestamp("); 
     currentExpr.append(Integer.parseInt($timestamp.text)); 
     currentExpr.append("), "); 
     currentExpr.append(Integer.parseInt($n_players.text)); 
     currentExpr.append(", "); 
     currentExpr.append(Integer.parseInt($position.text)); 
     currentExpr.append(", "); 
     currentExpr.append($action_p.text); 
     currentExpr.append(", "); 
     currentExpr.append($action_f.text); 
     currentExpr.append(", "); 
     currentExpr.append($action_t.text); 
     currentExpr.append(", "); 
     currentExpr.append($action_r.text); 
     currentExpr.append(", "); 
     currentExpr.append(Integer.parseInt($bankroll.text)); 
     currentExpr.append(", "); 
     currentExpr.append(Integer.parseInt($total_action.text)); 
     currentExpr.append(", "); 
     currentExpr.append(Integer.parseInt($amount_won.text)); 
     currentExpr.append(", "); 
     currentExpr.append("CARDS"); 
     currentExpr.append(");"); 
     System.out.println(currentExpr.toString()); 
     currentExpr = new StringBuilder(500); 
    } 
    : nick=NICK WS 
     timestamp=NUMBER WS 
     n_players=NUMBER WS 
     position=NUMBER WS 
     action_p=action WS 
     action_f=action WS 
     action_t=action WS 
     action_r=action WS 
     bankroll=NUMBER WS 
     total_action=NUMBER WS 
     amount_won=NUMBER WS 
     (NICK WS NICK WS)? // ignore this 
    ; 

action 
    : '-' 
    | ('B'|'f'|'k'|'b'|'c'|'r'|'A'|'Q'|'K')+ 
    ; 

我的問題是,當我運行解析器,出現以下錯誤:

[email protected]:~/src/DecisionTrees/grammar/output$ cat example | java Test 
line 1:26 no viable alternative at input 'Bk' 
line 1:30 no viable alternative at input 'cc' 
execute player_handplan(Lurker, to_timestamp(915236167), 10, 2, null, null, b, b, 1000, 70, 200, CARDS); 

爲什麼我的語法不接受「BK」,儘管它會接受「B」?我覺得我有一些明顯的東西可以忽略。在此先感謝

+0

嘗試改變輸入和查找其他替代品產生的解析器將不會接受。 – 2010-11-10 22:57:17

+0

它似乎拒絕所有字符在這一點上不止一個字符。 「c」起作用,「cc」不起作用,等等 – 2010-11-11 00:38:45

+0

爲什麼'action'在解析器中定義而不是詞法分析器? – 2010-11-11 03:42:03

回答

1

爲什麼不在規則WS中使用{$channel=HIDDEN}並使其不在行規則中。

這樣,至少你不會因爲偶然的放置太多的WS而陷入困境。

如果行動只能有2個字符最大可能想這將幫助:

action 
    : '-' 
    | ('B'|'f'|'k'|'b'|'c'|'r'|'A'|'Q'|'K')('B'|'f'|'k'|'b'|'c'|'r'|'A'|'Q'|'K')? 
    ; 
相關問題