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

Parsing 如何用ANTLR解析注释行中的信息,parsing,antlr,Parsing,Antlr,我有一个在评论中嵌入信息的来源。比如说 //IP x = 3 //IP y = 20 通常,“//”标记为注释,但“//IP”用于指示设置信息 如何解析注释以获得x和y的值 我可能有这些lexer规则,但我不确定动作部分。我可以提取基本的_标识符值吗 BASIC_IDENTIFIER : ('a'..'z' | 'A'..'Z') ( '_' | ('a'..'z' | 'A'..'Z') | ('0'..'9') )* ; IP_COMMENT : '//IP'

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

//IP x = 3
//IP y = 20
通常,“//”标记为注释,但“//IP”用于指示设置信息

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

我可能有这些lexer规则,但我不确定动作部分。我可以提取基本的_标识符值吗

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;}
  ;

您需要在lexer中对令牌进行优先级排序。我已经讨论过了。因此,使“//IP”的优先级高于“//”

头和成员 现在解析后的值在字典中,因此您可以获得键/值对

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

@Bart:With“-IP”、“-ip3=”、“-ipx=”示例,一切似乎都很好。事实上:我用v3.3测试了它,你说得对:它工作得很好!我很确定这会导致一些旧版本的v3出现问题。很高兴知道!:)为什么不创建一个
--IP
标记并使用解析器规则来匹配这些文档注释呢?从
“//ipx=3”
创建单个令牌将使以后从中提取信息变得更加困难。
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;}
  ;
foreach (KeyValuePair<string, string> kvp in VHDLParser.memory)
{
    Console.WriteLine("{0} - {1}", kvp.Key, kvp.Value);
}