2012-03-03 82 views
0

當調試在ANTLRWorks 3.4它給我folloing錯誤語法,ANTLRWorks調試錯誤

javax.swing.text.BadLocationException: Position not represented by view 

語法其中上述錯誤給出在下面列出。

grammar CMinusMinus; 

program   : (vardeclaration | fundeclaration)* EOF    ; 
vardeclaration : INT ID (OPENSQ NUM CLOSESQ)? SEMICOL     ; 

fundeclaration : typespecifier ID OPENP params CLOSEP compoundstmt  ; 
typespecifier : INT | VOID           ; 
params   : VOID | paramlist          ; 
paramlist  : param (COMMA param)*         ; 
param   : INT ID (OPENSQ CLOSESQ)?        ; 

compoundstmt : OPENCUR vardeclaration* statement* CLOSECUR   ; 
statementlist : statement*           ; 
statement  : expressionstmt | compoundstmt | selectionstmt 
       | iterationstmt | returnstmt       ; 
expressionstmt : (expression)? SEMICOL         ; 
selectionstmt : IF OPENP expression CLOSEP statement 
       ((ELSE)=> ELSE statement 
       | () 
       ) 
       ; 
iterationstmt : WHILE OPENP expression CLOSEP statement    ; 
returnstmt  : RETURN (expression)? SEMICOL       ; 

expression  : (var ASSIGN) => var ASSIGN expression 
       | simpleexpression          ; 
var    : ID (OPENSQ expression CLOSESQ)?      ; 

simpleexpression: addexpr ((LOREQ | LESS | GRTR | GOREQ | EQUAL | NTEQL) addexpr)? ; 
addexpr   : mulexpr ((PLUS | MINUS) mulexpr)*     ; 
mulexpr   : factor ((MULTI | DIV ) factor)*     ; 

factor   : (OPENP expression CLOSEP) | var | call | NUM  ; 
call   : ID OPENP arglist? CLOSEP        ; 
arglist   : expression (COMMA expression)*      ; 

ELSE : 'else' ; 
IF  : 'if'  ; 
INT  : 'int'  ; 
RETURN : 'return' ; 
VOID : 'void' ; 
WHILE : 'while' ; 


PLUS : '+' ; 
MINUS : '-' ; 
MULTI : '*' ; 
DIV  : '/' ; 

LESS : '<' ; 
LOREQ : '<=' ; 
GRTR : '>' ; 
GOREQ : '>=' ; 

EQUAL : '==' ; 
NTEQL : '!=' ; 
ASSIGN : '=' ; 

SEMICOL : ';' ; 
COMMA : ',' ; 

OPENP : '(' ; 
CLOSEP : ')' ; 
OPENSQ : '[' ; 
CLOSESQ : ']' ; 
OPENCUR : '{' ; 
CLOSECUR: '}' ; 

SCOMMENT: '/*' ; 
ECOMMENT: '*/' ; 


ID : ('a'..'z' | 'A'..'Z')+/*(' ')*/ ; 
NUM : ('0'..'9')+ ; 
WS : (' ' | '\t' | '\n' | '\r'/* | '\f'*/)+ {$channel = HIDDEN;}; 
COMMENT: '/*' .* '*/' {$channel = HIDDEN;}; 

而且測試文件,

/* A program to perform selection sort on a 10 
element array. */ 

int x[10]; 

int miniloc (int a[], int low, int high) 
{ int i, int x, int k; 


if (a<b) 
if (b<c) 
b=0; 
else 
c=0; 
else 
a=0; 




k= low; 
x = a[low]; 
i = low + 1; 
while (i < high) 
{ if (a[i] < x) 
{ x= a[i]; 
    k= i;} 
i = i+1; 
} 
return k; 
} 

void sort(int a[], int low, int high) 
{ int i, int k; 
i = low; 
while (i < high - 1) 
{ int t; 
k = minloc(a,i,high); 
t = a[k]; 
a[k] = a[i]; 
a[i] = t; 
i = i+1; 
} 
} 

void main(void) 
{ 
int i; 
i = 0; 
while (i < 10) 
{ x[i] = input(); 
i = i+1;} 
sort(x, 0, 10); 
i=0; 
while(i<10) 
{ output(x[i]); 
i = i + 1;} 
} 

還有什麼辦法來解決這個錯誤。這通常如何發生

謝謝。

+0

我無法用ANTLRWorks 1.4.3和javac 1.6(來自Sun/Oracle)重現此問題。調試器解析示例輸入沒有問題。 – 2012-03-04 08:45:47

+0

你沒有使用GCJ或其他一些奇怪的JDK/javac,對吧? – 2012-03-05 07:44:31

+0

@BartKiers:我使用的是Oracle JDK 7和javacc是7.0.20.13 – DarRay 2012-03-07 18:41:45

回答

2

您提到的ANTLRWorks 3.4不存在。有ANTLR 3.4和ANTLRWorks 1.4.3,所以我會認爲你使用ANTLR 3.4的ANTLRWorks 1.4.3。

ANTLRWorks在其構建中包含ANTLR的副本,因此您不能更改ANTLRWorks使用的ANTLR版本。這是因爲ANTLR不是保持向後兼容性的商業產品。所以爲了確保ANTLRWorks正常工作,用戶不能選擇使用ANTLR的版本。

基本上ANTLR 3.4是ANTLR 3.x的最後一個版本,它沒有經過測試,以確保它與ANTLRWorks一起工作。最大的問題之一是ANTLR 3.4不會生成NFA和DFA圖表,ANTLRWorks需要這些圖表才能工作,因爲它使用ANTLR的輸出來顯示NFA和DFA圖表。

通常Ter會修復ANTLR,如果這樣做會解決ANTLRWorks的問題。然而,Ter和其他人基本上停止了ANTLR 3.X的所有工作,轉而使用ANTLR 4.x(Honey Badger)。所以ANTLR 3.4是有問題的,並沒有被修補與ANTLRWorks一起工作,也沒有新的ANTLRWorks 1.4.x版本可以與ANTLR 3.x一起使用。 ANTLR 4.x將會有一個新的ANTLRWorks 2.x。

所以你可能會認爲我現在已經把你推進了一堵磚牆,並且堅持住了。

我把你的樣本剪切並粘貼到ANTLRWorks 1.4.2中,啓動調試器並點擊「Go To End」按鈕。它工作沒有問題。我必須提到,這是在作爲VMware虛擬機運行的Debian系統上完成的。我有這個,這樣它就不會受到其他任何東西的污染。

故事的道德是遠離ANTLRWorks 1.4.3,而是使用ANTLRWorks 1.4.2。另外,如果你有一臺機器不能確定不會有問題,例如不同的JVM版本或不正確的類路徑等,請考慮使用虛擬機。

+0

我用ANTLRWorks 1.4.3測試了OP的語法,並沒有任何問題。請注意,我從未遇到過使用ANTLRWorks 1.4.3及其調試器的問題。 – 2012-03-11 18:59:39

1

我收到同樣的異常。我可以通過從{$channel=HIDDEN}切換到{skip();}來解決它。