ANTLR4:上下文相关的空格?

时间:2016-02-01 22:58:04

标签: java parsing antlr4 lexer

在语法中,我想实现没有字符串分隔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 lexer-rule,则为空格 在“somethingelse;”被忽略(由lexer-rule WS),以便解析器规则 stat:somethingelse因此被正确检测到。 但是由于删除了SPACE规则,内容文本将缩减为单个中间空格, 所以“这里”将被简化为“这里”。

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

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

在内容解析器规则中

应该保留任何空间, 在任何其他规则空间应该被忽略。

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

2 个答案:

答案 0 :(得分:1)

您考虑过Lexer Modes了吗?带有 mode(),pushMode(),popMode 的部分可能对您有用。

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

答案 1 :(得分:0)

由于SPACE规则在WS规则之前,因此词法分析器会将空格标记返回给解析器。 “不会被放置在隐藏的频道上。