1

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

@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。

你看出什么问题了吗?

4

1 回答 1

1

我看到了两个问题:

  1. 您没有考虑"@comment"和 first之间的空格"{"。请注意,空格被放在解析器规则的隐藏通道上,而不是词法分析器规则!
  2. ( options {greedy = false; }: . )+您匹配的只是第一个"}",而不是平衡的大括号。

尝试这样的事情:

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)* '}'
 ;
于 2013-02-21T17:23:16.653 回答