我想与您分享一个我必须在ANTLR4中实现的岛屿解决方案。
>
该语言定义了一个特殊的命令put
,其结构如下:
放[<专用语言>]
。
我的解决办法是:
public Token nextToken() {
if (f_current_idx != -1) {
_input.seek(f_current_idx); f_current_idx = -1;
}
Token l_token = super.nextToken(); return l_token;
}
PUT :
'PUT'
{
f_current_idx = _input.index(); ((ANTLRStringStream) _input).rewind();
SRC_PUTLexer l_put_lexer = new SRC_PUTLexer(_input);
UnbufferedTokenStream<Token> l_tokenStream = new UnbufferedTokenStream<Token>(l_put_lexer);
if (l_tokenStream.LA(2) == SRC_PUTLexer.LBRACK) {
new SRC_PUTParser(l_tokenStream).start_rule(); f_current_idx = _input.index();
}
};
public class ANTLRStringStream extends ANTLRInputStream {
protected int markDepth = 0;
protected int lastMarker;
protected ArrayList<Integer> markers;
public ANTLRStringStream() {
super();
}
public ANTLRStringStream(String input) {
super(input);
}
public int mark() {
if ( markers==null ) { markers = new ArrayList<Integer>(); }
markers.add(markDepth, index()); markDepth++; lastMarker = markDepth;
return markDepth;
}
public void rewind(int m) {
int state = (int) markers.get(m); seek(state); release(m);
}
public void rewind() { rewind(lastMarker); }
public void release(int marker) {
markDepth = marker; markDepth--;
}
}
任何反馈都是非常欢迎的!问候,沃尔夫冈·哈默
这真的应该是一个社区维基。
我的第一个主要评论是,您需要删除ANTLRStringStream
类。ANTLR4提供的ANTLRInputStream
类提供了ANTLR3中ANTLRStringStream
的功能。IntStream
和CharStream
接口在ANTLR4中进行了修改和大量记录,以消除有问题的rewind
方法和其他未定义的行为。你不应该再介绍他们。
问题内容: 谁能解释垃圾收集 隔离岛 的概念吗? 问题答案: 对象A引用对象B。对象B引用对象A。任何其他对象都没有引用对象A和对象B。那是一个孤立的孤岛。 基本上,隔离孤岛是一组相互引用的对象,但是应用程序中的任何活动对象都不会引用它们。严格来说,即使是单个未引用的对象也都是孤立的孤岛。 编辑评论:
我正在使用Antrl4解析一种类似java的语言,在这种语言中,可以使用专有的查询语言在括号中编写表达式。假设在Java方法中,应该允许以下行: 但这会导致第一个括号字符上的令牌识别错误。 这种做法有什么问题吗?有人能指出我正在犯的错误吗?
作为我的小语言示例问题的延续,我想问一下如何解析下面的文本。这次只是想跳过尾巴规则,但它是一个岛,对我来说并不明显。最好的,不那么陈腐的方法? 使用以下使用词法模式的语法: 使用不同顺序的lexer规则。也尝试了更多的词汇命令,但没有成功。
问题内容: (PostgreSQL 8.4) 我对SQL的空白和孤岛做了很好的介绍,但是我仍然有一个问题。许多孤岛检测CTE基于时间戳的运行顺序和一些标志,这些标志在更改时会破坏序列。但是,如果“中断”条件稍微复杂些怎么办? 在这种情况下,表示设备,并且为或。我想选择的记录,,,并具有以下逻辑。 10转为OFF-正确结束序列,忽略行 11接通-确定,新序列,包括在SELECT中 11开启-重复,忽
问题内容: 我必须使用此表: 期间 它列出了学生不必上学的所有时间段。不幸的是,有些时期是重叠的。当在学校放假期间周末或公共假期发生时(每个人都有自己的时段行),就会发生这种情况。 在查找具有休止日期范围的行的帮助下,并在具有联邦州的国家/地区中,累加了它们的持续时间,空缺和离校假期,我最终得到了以下查询: 我得到什么 结果是 前三行为0(标识678、534和679)。 我想要的是 但是id 9、
问题内容: 我试图计算二维二进制矩阵中的孤岛数量(一组相连的1组成一个孤岛)。 例: 在上面的矩阵中,有5个岛,分别是: 为了计算2D矩阵中的孤岛数量,我假设矩阵为图,然后使用DFS类型的算法对孤岛进行计数。 我一直在跟踪DFS(递归函数)调用的数量,因为在Graph中有很多组件。 下面是我为此目的编写的代码: 我传入参数的矩阵输出错误。我知道了,但是有集群。 我尝试调试任何逻辑错误的代码。但是我