当前位置: 首页 > 知识库问答 >
问题:

ANTLR4 DefaultErrorStrategy无法注入丢失的令牌

庾波光
2023-03-14

我试图在TestRig中运行以下语法:

grammar COBOLfragment;

// hidden tokens
WS : [ ]+ -> channel(HIDDEN);
NL : '\n' -> channel(HIDDEN);

// keywords
PERIOD : '.';

DIVISION : 'DIVISION';
SECTION : 'SECTION';

DATA : 'DATA';
WORKING_STORAGE : 'WORKING-STORAGE';

FILE : 'FILE';

FD : 'FD';

EXTERNAL : 'EXTERNAL';
GLOBAL : 'GLOBAL';

BLOCK : 'BLOCK';
CONTAINS : 'CONTAINS';
CHARACTERS : 'CHARACTERS';

// data
INTEGER : [0-9]+;
ID : [A-Z][A-Z0-9]*;

dataDivision :
    DATA DIVISION PERIOD
    fileSection?
    workingStorageSection?
;

fileSection :
    FILE SECTION PERIOD
    fileDescription*
;

fileDescription :
    FD fileName=ID
//    (IS? GLOBAL)?          // 1. IS GLOBAL clause
//    (IS? EXTERNAL)?        // 2. IS EXTERNAL clause
    blockClause?
    PERIOD
;

blockClause :
    BLOCK CONTAINS? blockSize=INTEGER CHARACTERS
;

workingStorageSection :
    WORKING_STORAGE SECTION PERIOD
;

使用以下输入:

DATA DIVISION.
FILE SECTION.
FD FD01
WORKING-STORAGE SECTION.

显然,第三行输入(“fd fd01”)缺少在FileDescription规则中要求的结束符句点

旁注1:如果我启用了IS EXTERNAL或IS GLOBAL子句,但不是两个子句都启用,那么DefaulTerrorStrategy可以很好地工作,并注入丢失的令牌。

附带说明2:为启用两个子句的语法生成的代码有以下额外代码(与只启用其中一个子句的语法相比):

public final FileDescriptionContext fileDescription() ... {
    ...
    try {
        ...
        switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
        case 1:
            {
            setState(31);
            _la = _input.LA(1);
            if (_la==IS) {
                {
                setState(30); match(IS);
                }
            }

            setState(33); match(GLOBAL);
            }
            break;
        }
        ...
    }
    catch (RecognitionException re) {
        ...

AdaptivePredict()调用是罪魁祸首,因为它在解析器有机会进行匹配(PERIOD)之前,在输入'working-storage'抛出没有可行的替代选项(在生成的代码中,此处没有粘贴)。


共有1个答案

皇甫伟彦
2023-03-14

我已经设法解决了这个问题,为两个IS子句添加了一个新子句:

(这里只是片段改变了)

...
fileDescription :
    FD fileName=ID
    isClauses?
    blockClause?
    PERIOD
;

isClauses :
    IS? GLOBAL (IS? EXTERNAL)?
|   IS? EXTERNAL
;
...

现在,DefaulTerrorStrategy执行它的工作,并注入缺少的句点

 类似资料:
  • 问题内容: 我有Django的1.3版。我尝试按照其他人的问题指定localhost:8000,但这对我不起作用。我正在尝试使用文件上传表单,但是我收到一个错误,即form.py没有CSRF令牌。 form.py: views.py: upload.html: 我很沮丧,请告诉我一些尝试的方法。谢谢 问题答案: 你需要传递 为此:(views.py) 这会将csrf的令牌传递到模板。

  • 问题内容: 在这里是Django的初学者,我已经尝试了很长时间了。我的中间件类中确实有“ django.middleware.csrf.CsrfViewMiddleware”,并且我的帖子中确实有令牌。 这是我的代码,我在做什么错? 这是我的模板: 问题答案: 你应该使用自动使用的快捷功能 使用https://docs.djangoproject.com/en/2.2/topics/http/sh

  • 问题内容: 我正在使用Django 1.7和django-rest-framework。 我制作了一个API,该API返回了一些JSON数据,并将其放入了我的 settings.py 当我进行GET调用时,它将返回我所有的数据,但是当我尝试使用PUT / PATCH时,我得到: 仅当我登录时才会发生这种情况,如果我是匿名用户,则可以正确进行PUT / PATCH。 我尝试过,但遇到错误,我将设置包

  • 我在使用StringRedisTemplate时出现了错误,日志信息如图: 看样子是注入失败,可是为什么会这样呢? 我的springboot版本是2.7,redis-data版本2.7. yml文件中的配置信息如下: 好像什么配置都有了,版本应该也不会冲突。。 大佬们求解啊。。

  • 我最近用aspectJ和spring-aop添加了AOP到我现有的spring项目中。目标是实际截获控制器调用以修改它们发回的响应,以便将一些值绑定到此响应,我不想手动添加到每个控制器中,例如最终用户使用的实际令牌的到期日期(无论如何我都无法在控制器中显示它)。实际上,在开始单元测试之前,我一直设法让它工作: 在我的单元测试中,我使用java中的反射特性直接调用我的控制器方法,然后复制通常的过程(

  • 我正在学习Spring Boot 2.0和React的全栈开发。身份验证和授权由JWT管理,除了我必须在刷新浏览器后重新登录之外,应用程序按预期工作。如何在浏览器刷新后维护JWT令牌?