我正在使用带有c#目标的Antlr4。下面是我的语法的一个子集:
/*
* Parser Rules
*/
text : term+ EOF;
term : a1 a2 a3;
a1: ....
...
...我想接受有效数据块作为(术语)s,当存在错误时,我想搜索下一个有效术语,并打印出导致错误的整个文本,供用户手动分析。
如何将输入同步到下一个有效项?如何获取被忽略的文本?
发布于 2013-09-01 07:18:46
您需要为此创建自己的IAntlrErrorStrategy实现,然后将Parser.ErrorHandler属性设置为您的错误策略的一个实例。ANTLRErrorStrategy接口的Java版本和缺省实现DefaultErrorStrategy的文档可能会为实现错误策略提供有用的信息,但我必须警告您,创建自定义错误策略是一个高级功能,文档有限。预计实现者已经是ANTLR 4实现自适应LL(*)解析算法的专家(我们说的是研究人员级别的理解)。
发布于 2013-09-02 08:19:51
对于第一个问题(如何将输入同步到下一个有效项?)我发现了一些有用的信息,这些信息让我找到了可以接受的解决方案。
Antlr为前面的语法生成下一个子代码:
public TextContext text() {
TextContext _localctx = new TextContext(_ctx, State);
EnterRule(_localctx, 0, RULE_text);
int _la;
try {
EnterOuterAlt(_localctx, 1);
State = 49;
_errHandler.Sync(this);
_la = _input.La(1);
do {
State = 48; term();
State = 51;
_errHandler.Sync(this);
_la = _input.La(1);
} while ( _la==KEYWORD );
State = 53; Match(EOF);
}
catch (RecognitionException re) {
_localctx.exception = re;
_errHandler.ReportError(this, re);
_errHandler.Recover(this, re);
}
finally {
ExitRule();
}
return _localctx;
}调用'_errHandler.Sync(this);‘使解析器在输入流中前进,试图找到下一个有效的转折(作为"term+“组件的结果)。为了阻止解析器在其他接受"term“规则的子规则中同步,我将DefaultErrorStrategy类扩展为next:
public class MyErrorStrategy : Antlr4.Runtime.DefaultErrorStrategy
{
public EventErrorStrategy() : base()
{ }
public override void Sync(Antlr4.Runtime.Parser recognizer)
{
if(recognizer.Context is Dict.TextAnalyzer.DictionaryParser.TextContext)
base.Sync(recognizer);
}
}然后将其提供给解析器:
parser.ErrorHandler = new MyErrorStrategy();https://stackoverflow.com/questions/18550031
复制相似问题