0

当我在 ANTLRWorks 3.4 中调试语法时,它给了我以下错误,

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;}
}

有没有办法解决这个错误。这通常是如何发生的

谢谢你。

4

2 回答 2

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 图。

通常,如果通过这样做可以解决 ANTLRWorks 的问题,Ter 会修复 ANTLR。然而,Ter 和其他人基本上停止了 ANTLR 3.X 的所有工作,转而使用 ANTLR 4.x(Honey Badger)。所以 ANTLR 3.4 是有缺陷的,并且没有被修补以与 ANTLRWorks 一起工作,也不会有新的 ANTLRWorks 1.4.x 版本与 ANTLR 3.x 一起使用。将有一个新的 ANTLRWorks 2.x 与 ANTLR 4.x 一起使用。

所以你可能会认为我现在把你逼进了砖墙,等等。

我将您的示例剪切并粘贴到 ANTLRWorks 1.4.2 中,启动调试器并单击“Go To End”按钮。它没有问题。我必须提到,这是在作为 VMware 虚拟机运行的 Debian 系统上完成的。我有这个,所以它不会被其他任何东西污染。

故事的寓意是远离 ANTLRWorks 1.4.3,而是使用 ANTLRWorks 1.4.2。此外,如果您的机器不能绝对确定不会出现诸如不同的 JVM 版本或不正确的类路径等问题,请考虑使用虚拟机。

于 2012-03-11T18:37:30.507 回答
1

我得到了同样的例外。我可以通过从 切换到{$channel=HIDDEN}来解决它{skip();}

于 2012-11-15T14:54:31.693 回答