Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是什么导致Antlr创建一个大的令牌流,导致内存不足_Java_Antlr3 - Fatal编程技术网

Java 是什么导致Antlr创建一个大的令牌流,导致内存不足

Java 是什么导致Antlr创建一个大的令牌流,导致内存不足,java,antlr3,Java,Antlr3,我们的一个web应用程序经常因为内存不足而死掉。我们从内存转储中收集的稀疏数据表明,我们的antlr解析实现中存在一个问题。我们看到的是一个antlr令牌流,包含超过一百万个项目。导致这种情况的输入文本尚未找到 这是否可能与零宽度项匹配有关? 语法中是否还有其他问题导致内存过度使用 以下是我们目前使用的语法: grammar AdvancedQueries; options { language = Java; output = AST; ASTLabelType=CommonTr

我们的一个web应用程序经常因为内存不足而死掉。我们从内存转储中收集的稀疏数据表明,我们的antlr解析实现中存在一个问题。我们看到的是一个antlr令牌流,包含超过一百万个项目。导致这种情况的输入文本尚未找到

这是否可能与零宽度项匹配有关? 语法中是否还有其他问题导致内存过度使用

以下是我们目前使用的语法:

grammar AdvancedQueries;

options {
  language = Java;
  output = AST;
  ASTLabelType=CommonTree;
}

tokens {
FOR;
END;
FIELDSEARCH;
TARGETFIELD;
RELATION;
NOTNODE;
ANDNODE;
NEARDISTANCE;
OUTOFPLACE;
}

@header {
package de.bsmo.fast.parsing;
}

@lexer::header {
package de.bsmo.fast.parsing;
}

startExpression  : orEx;

expressionLevel4    
: LPARENTHESIS! orEx RPARENTHESIS! | atomicExpression | outofplace;

expressionLevel3    
: (fieldExpression) | expressionLevel4 ;

expressionLevel2    
: (nearExpression) | expressionLevel3 ;

expressionLevel1    
: (countExpression) | expressionLevel2 ;


notEx   : NOT^? a=expressionLevel1 ;

andEx   : (notEx        -> notEx)
(AND? a=notEx -> ^(ANDNODE $andEx $a))*;

orEx    : andEx (OR^  andEx)*;

countExpression  : COUNT LPARENTHESIS countSub RPARENTHESIS RELATION NUMBERS -> ^(COUNT countSub RELATION NUMBERS);

countSub 
    :   orEx;

nearExpression  : NEAR LPARENTHESIS (WORD|PHRASE) MULTIPLESEPERATOR (WORD|PHRASE) MULTIPLESEPERATOR NUMBERS RPARENTHESIS -> ^(NEAR WORD* PHRASE* ^(NEARDISTANCE NUMBERS));

fieldExpression : WORD PROPERTYSEPERATOR fieldSub  -> ^(FIELDSEARCH ^(TARGETFIELD WORD) fieldSub );

fieldSub 
    :   WORD | PHRASE | LPARENTHESIS! orEx RPARENTHESIS!;  

atomicExpression 
: WORD
| PHRASE
| NUMBERS
;

//Out of place are elements captured that may be in the parseable input but need to be ommited from output later
//Those unwanted elements are captured here.
//MULTIPLESEPERATOR capture unwanted "," 
outofplace
: MULTIPLESEPERATOR -> ^(OUTOFPLACE ^(MULTIPLESEPERATOR));

fragment NUMBER : ('0'..'9');
fragment CHARACTER : ('a'..'z'|'A'..'Z'|'0'..'9'|'*'|'?');
fragment QUOTE     : ('"');
fragment LESSTHEN : '<';
fragment MORETHEN: '>';
fragment EQUAL: '=';
fragment SPACE     : ('\u0009'|'\u0020'|'\u000C'|'\u00A0');

fragment WORDMATTER:  ('!'|'0'..'9'|'\u0023'..'\u0027'|'*'|'+'|'\u002D'..'\u0039'|'\u003F'..'\u007E'|'\u00A1'..'\uFFFE');

LPARENTHESIS : '(';
RPARENTHESIS : ')';

AND    : ('A'|'a')('N'|'n')('D'|'d');
OR     : ('O'|'o')('R'|'r');
ANDNOT : ('A'|'a')('N'|'n')('D'|'d')('N'|'n')('O'|'o')('T'|'t');
NOT    : ('N'|'n')('O'|'o')('T'|'t');
COUNT:('C'|'c')('O'|'o')('U'|'u')('N'|'n')('T'|'t');
NEAR:('N'|'n')('E'|'e')('A'|'a')('R'|'r');
PROPERTYSEPERATOR : ':';
MULTIPLESEPERATOR : ',';

WS     : (SPACE) { $channel=HIDDEN; };
NUMBERS : (NUMBER)+;
RELATION : (LESSTHEN | MORETHEN)? EQUAL // '<=', '>=', or '='
 | (LESSTHEN | MORETHEN);        // '<' or '>'
PHRASE : (QUOTE)(.)*(QUOTE);
WORD   : WORDMATTER* ;
语法高级查询;
选择权{
语言=Java;
输出=AST;
ASTLabelType=CommonTree;
}
代币{
对于
结束;
实地调查;
靶场;
关系
NOTNODE;
ANDNODE;
近距离;
不合时宜;
}
@标题{
包de.bsmo.fast.parsing;
}
@lexer::header{
包de.bsmo.fast.parsing;
}
startExpression:orEx;
表达水平4
:LPARENTHESIS!orEx RPARENTHESIS!|原子表达式|不合适;
表达水平3
:(字段表达式)|表达式级别4;
表达级别2
:(近表达式)|表达式级别3;
表达水平1
:(countExpression)| expressionLevel2;
注十:不是^?a=表达式级别1;
安第斯:(注->注)
(和?a=notEx->^(和节点$andEx$a))*;
俄勒冈州:安第斯山脉(或安第斯山脉)*;
countExpression:COUNT LPARENTHESIS countSub RPARENTHESIS relationship number->^(COUNT countSub relationship number);
countSub
:orEx;
nearExpression:nearlparenthesis(单词|短语)多运算符(单词|短语)多运算符数RPARENTHESIS->^(nearword*短语*^(近距离数));
fieldExpression:WORD PropertySoperator fieldSub->^(FIELDSEARCH^(TARGETFIELD WORD)fieldSub);
野潜艇
:单词|短语| LPARENTHESIS!orEx RPARENTHESIS!;
原子表达式
:字
|词组
|数字
;
//不合适的是捕获的元素,这些元素可能在可解析的输入中,但稍后需要从输出中删除
//这些不需要的元素在这里被捕获。
//多处理器捕获不需要的“,”
不合时宜
:多重运算符->^(不在同一位置^(多重运算符));
片段编号:('0'..'9');
片段字符:('a'..'z'|'a'..'z'|'0'..'9'|'*'|'?');
片段引号:(“”);
片段LESSTHEN:“”;
片段相等:'=';
片段空间:('\u0009'|'\u0020'|'\u000C'|'\u00A0');
片段词:(“!”|“0”…“9”|“\u0023”…“\u0027”|“*”|“+”|“\u002D”…“\u0039”|“\u003F”…\u007E”|“\u00A1”…\UFFE”);
LPARENTHESIS:'(';
RPARENTHESIS:“)”;
和:('A'|'A')('N'|'N')('D'|'D');
或者:('O'|'O')('R'|'R');
而不是:('A'|'A')('N'|'N')('D'|'D')('N'|'N')('O'|'O')('T'|'T');
不是:('N''N')('O''O')('T''T');
计数:('C'|'C')('O'|'O')('U'|'U')('N'|'N')('T'|'T');
近:('N''N')('E''E')('A''A')('R''R');
属性运算符:':';
多重运算符:',';
WS:(空格){$channel=HIDDEN;};
数字:(数字)+;
关系:(LESSTHEN | MORETHEN)?等于/“=”,或“=”
|(LESSTHEN | MORETHEN);/“”
短语:(引号)()*(引号);
单词:WORDMATTER*;

最常见的原因是长度为0的令牌。文件中任何两个其他令牌之间可能存在无限多的此类令牌。定义这样的令牌现在会在ANTLR 4中导致编译器警告

以下规则可以匹配空字符串:

WORD : WORDMATTER*;
也许你想用下面的方法来代替

WORD : WORDMATTER+;

听起来似乎有道理,尤其是因为这个零长度匹配并不是闻所未闻的。你能想到一个触发它的输入吗?我的意思是,默认情况下,antlr是贪婪的,那么它是如何匹配零长度字符串的呢?它通常发生在输入包含一个无法匹配任何字符(非零长度)的序列时令牌。双引号字符串缺少最后一个
应该足以触发您的语法。谢谢!Hmm AntlWork 1.4.3或我的代码没有被“xxxyyzzz”阻塞。我最初的问题得到了回答,但我很难理解为什么可能困扰我们的实时服务器的错误无法复制。有什么想法吗?@ThomasS尝试输入$(包含任何lexer规则都不允许的单个字符).或者您可以尝试在服务器上输入的实际输入?