如何使用ANTLR解析注释行中的信息

时间:2011-12-30 21:03:49

标签: parsing antlr

我有一个在评论中嵌入信息的来源。例如

//IP x = 3
//IP y = 20

通常,“//”标记为注释,但“// IP”用于指示设置设置信息。

如何解析注释以获取x和y的值?

我可能有这些词法规则,但我不确定动作部分。我可以提取BASIC_IDENTIFIER值吗?

BASIC_IDENTIFIER
   :    ('a'..'z' | 'A'..'Z') ( '_' |  ('a'..'z' | 'A'..'Z') |  ('0'..'9') )*
   ;

IP_COMMENT
  : '//IP' (BASIC_IDENTIFIER\s?'='\s?BASIC_IDENTIFIER) ( ~'\n' )* {???}
  ;  

COMMENT
  : '//' ( ~'\n' )* {$channel=HIDDEN;}
  ;

2 个答案:

答案 0 :(得分:2)

标题和成员

// START:members
@header {
using System.Collections.Generic;
}

@members {
public static Dictionary<string, string> memory = new Dictionary<string, string>();
}

语法规则更改

DECIMAL_LITERAL
   :    ('0'..'9') ( '_' |  ('0'..'9') )* ( ( '.' ('0'..'9') ( '_' |  ('0'..'9') )* )? ( EXPONENT )? )
   ;

BASIC_IDENTIFIER
   :    ('a'..'z' | 'A'..'Z') ( '_' |  ('a'..'z' | 'A'..'Z') |  ('0'..'9') )*
   ;

IP_COMMENT
  : '--IP' (' ')+ (id = BASIC_IDENTIFIER) (' ')* '=' (' ')* (val = DECIMAL_LITERAL| var = BASIC_IDENTIFIER) ( ~'\n' )* {VHDLParser.memory[$id.text] = $val.text; $channel=HIDDEN;}
  ;  

COMMENT
  : '--' ( ~'\n' )* {$channel=HIDDEN;}
  ;

现在解析的值在Dictionary中,因此您可以获得键/值对。

foreach (KeyValuePair<string, string> kvp in VHDLParser.memory)
{
    Console.WriteLine("{0} - {1}", kvp.Key, kvp.Value);
}

答案 1 :(得分:0)

您需要在词法分析器中优先考虑您的令牌。 this answer对此进行了讨论。因此,使“// IP”的优先级高于“//”。