2012-03-03 97 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();}来解决它。