Как разобрать информацию в строке комментария с помощью ANTLR - PullRequest
1 голос
/ 31 декабря 2011

У меня есть источник, который вставил информацию в комментарии.Например,

//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 ]

2 голосов
/ 31 декабря 2011

Заголовок и Элемент

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

Теперь проанализированное значение находится в словаре, поэтому вы можете получить пару ключ / значение.

foreach (KeyValuePair<string, string> kvp in VHDLParser.memory)
{
    Console.WriteLine("{0} - {1}", kvp.Key, kvp.Value);
}
0 голосов
/ 31 декабря 2011

Вам нужно расставить приоритеты ваших токенов в лексере. этот ответ обсуждает это. Поэтому сделайте "// IP" более приоритетным, чем "//".

...