ANTLR4:上下文相关空间?

ANTLR4: context-sensitive spaces?

在语法中,我想实现没有字符串定界的文本 xxx。 这个想法是定义像

这样的东西
a = xxx;

而不是

a ="xxx";

简化打字。否则应该有变量定义 和其他种类的东西。

作为第一种方法,我尝试了这个语法:

    grammar SpaceNoSpace;

    prog: stat+;

    stat:
     'somethingelse' ';'
    | typed description* content
    ;

    typed:
     'something' '-'  
         | 'anotherthing' '-'
    ;

    description: 
             'someSortOfDetails'  COLON  ID HASH  
         | 'otherSortOfDetails' COLON  ID HASH 
    ;

    content:    
        contenttext ';'
    ;

    contenttext: 
         (~';')*
    ;

    COLON: ':' ;
    HASH: '#';
    SEMI: ';';
    SPACE: ' ';
    ID: [a-zA-Z][a-zA-z0-9]+;
    WS  :   [ \t\n\r]+ -> channel(HIDDEN);
    ANY_CHAR : . ; 

这适用于像这样的输入文件:

    something-someSortOfDetails: aVariableName#
    this is the content of this;

    anotherthing-someSortOfDetails: aVariableName#
    here spaces are accepted as much        as you like;

    somethingelse;

但是修改最后一行为

    somethingelse ;

导致语法错误:

    line 7:15 extraneous input ' ' expecting ';'

这可能揭示了词法分析器规则

  WS  :   [ \t\n\r]+ -> channel(HIDDEN);

不适用,(但SPACE规则???)。

否则,如果我删除 SPACE 词法分析器规则,space in "somethingelse ;" 被忽略(通过 lexer-rule WS),因此解析器规则 stat :因此正确检测到其他内容。 但是由于删除了 SPACE-rule,内容文本将减少为单个 in-between-spaces, 所以 "this here" 将减少到 "this here".

这不是什么大问题,但仍然是一个问题 有趣的问题:

是否可以实现上下文相关的 WS 或 SPACE 词法分析器规则:

在内容解析器规则中任何 space 都应该被保留, 在任何其他规则中 spaces 应该被忽略。

是否可以在 ANTLR4 中定义这种上下文相关的词法分析器规则行为?

由于 SPACE 规则在 WS 规则之前,词法分析器向解析器返回一个 space 标记。 “ ”未放置在隐藏频道上。

你考虑过Lexer Modes吗? mode()、pushMode()、popMode 部分对您来说可能很有趣。

但我认为词法分析器模式更多的是问题而不是解决方案。它们的目的是在词法分析器中使用(解析器)上下文。因此,人们应该放弃分离词法分析器和解析器的范例 - 而是使用 PEG 解析器。