特别评论不能匹配词法规则

时间:2013-02-21 16:56:35

标签: antlr

我想解析的一个示例文本是这样的 -

@comment {
    { something }
    { something else }
}

基本上“@comment”是搜索的关键,之后是一对匹配的大括号。我不需要解析大括号之间的内容。由于这类似于C'多行注释,我的语法基于:

grammar tryit;


tryit : top_cmd 
        ;

WS : ('\t' | ' ')+  {$channel = HIDDEN;};

New_Line : ('\r' | '\n')+   {$channel = HIDDEN;};

top_cmd :cmds 
        ;

cmds
    : cmd+
    ;

cmd
    : Comment
    ;

Comment
    : AtComment    Open_Brace  ( options {greedy = false; }: . )+  Close_Brace
    ;

AtComment
    : '@comment'
    ;

Open_Brace
    : '{'
    ;

Close_Brace
    : '}'
    ;

但是在ANTLRWORKS测试中,我立即得到了EarlyExitException。

你看到了什么问题吗?

1 个答案:

答案 0 :(得分:1)

我看到两个问题:

  1. 您未考虑"@comment"与第一个"{"之间的空格。请注意,对于解析器规则,空格放在HIDDEN通道上,对于词法分析器规则, 不是
  2. ( options {greedy = false; }: . )+您只是匹配第一个"}",而不是平衡的大括号。
  3. 尝试这样的事情:

    tryit
     : top_cmd 
     ;
    
    top_cmd
     : cmds 
     ;
    
    cmds
     : cmd+
     ;
    
    cmd
     : Comment
     ;
    
    Comment
     : '@comment' ('\t' | ' ')* BalancedBraces
     ;
    
    WS
     : ('\t' | ' ')+  {$channel = HIDDEN;}
     ;
    
    New_Line
     : ('\r' | '\n')+   {$channel = HIDDEN;}
     ;
    
    fragment
    BalancedBraces
     : '{' (~('{' | '}') | BalancedBraces)* '}'
     ;