首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Antlr4/ c#中控制错误处理和同步

如何在Antlr4/ c#中控制错误处理和同步
EN

Stack Overflow用户
提问于 2013-09-01 00:04:24
回答 2查看 5.3K关注 0票数 4

我正在使用带有c#目标的Antlr4。下面是我的语法的一个子集:

代码语言:javascript
运行
复制
/*
 * Parser Rules
 */
text : term+  EOF;
term : a1 a2 a3;
a1: ....
...
...

我想接受有效数据块作为(术语)s,当存在错误时,我想搜索下一个有效术语,并打印出导致错误的整个文本,供用户手动分析。

如何将输入同步到下一个有效项?如何获取被忽略的文本?

EN

回答 2

Stack Overflow用户

发布于 2013-09-01 07:18:46

您需要为此创建自己的IAntlrErrorStrategy实现,然后将Parser.ErrorHandler属性设置为您的错误策略的一个实例。ANTLRErrorStrategy接口的Java版本和缺省实现DefaultErrorStrategy的文档可能会为实现错误策略提供有用的信息,但我必须警告您,创建自定义错误策略是一个高级功能,文档有限。预计实现者已经是ANTLR 4实现自适应LL(*)解析算法的专家(我们说的是研究人员级别的理解)。

票数 6
EN

Stack Overflow用户

发布于 2013-09-02 08:19:51

对于第一个问题(如何将输入同步到下一个有效项?)我发现了一些有用的信息,这些信息让我找到了可以接受的解决方案。

Antlr为前面的语法生成下一个子代码:

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

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

然后将其提供给解析器:

代码语言:javascript
运行
复制
parser.ErrorHandler = new MyErrorStrategy();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18550031

复制
相关文章

相似问题

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