首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLRWorks调试错误

ANTLRWorks调试错误
EN

Stack Overflow用户
提问于 2012-03-04 02:26:27
回答 2查看 488关注 0票数 0

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

代码语言:javascript
复制
javax.swing.text.BadLocationException: Position not represented by view

下面列出了上面给出的错误的语法。

代码语言:javascript
复制
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;};

测试文件是,

代码语言:javascript
复制
/* 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;}
}

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

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-03-12 02:37:31

你提到了不存在的ANTLRWorks 3.4。有ANTLR3.4和ANTLRWorks 1.4.3,所以我认为您使用的是使用ANTLR3.4的ANTLRWorks 1.4.3。

ANTLRWorks在其构建中包含了ANTLR的副本,因此您不能更改ANTLRWorks使用的ANTLR的版本。这是因为ANTLR不是维护向后兼容性的商业产品。因此,为了确保ANTLRWorks正常工作,用户不能选择要使用的ANTLR版本。

基本上,ANTLR3.4是ANTLR3.x发布的最后一个版本,它没有经过测试以确保它可以与ANTLRWorks一起工作。最大的问题之一是ANTLR3.4不会生成NFA和DFA图,而这些是ANTLRWorks工作所必需的,因为它使用ANTLR3.4的输出来显示NFA和DFA图。

通常,如果这样做可以修复ANTLRWorks的问题,那么Ter就会修复ANTLR。然而,Ter和其他人基本上停止了在ANTLR 3.X上的所有工作,以转移到ANTLR 4.x (蜜腺癌)。因此,ANTLR3.4是错误的,并没有被打补丁来与ANTLRWorks一起工作,也不会有新的ANTLRWorks 1.4.x版本去与ANTLR3.x。将有一个新的ANTLRWorks 2.x与ANTLR4.x一起使用。

所以你可能会认为我现在把你逼入了绝境,等等。

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-11-15 22:54:32

我得到了同样的异常。我可以通过从{$channel=HIDDEN}切换到{skip();}来解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9548684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档