当我在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;}
}有没有办法解决这个错误。这种情况通常是如何发生的
谢谢。
发布于 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版本或不正确的类路径等,请考虑使用虚拟机。
发布于 2012-11-15 22:54:32
我得到了同样的异常。我可以通过从{$channel=HIDDEN}切换到{skip();}来解决这个问题。
https://stackoverflow.com/questions/9548684
复制相似问题