Antlr4 с использованием C # - ini parser - анализирует значение ключа, который является ключом к другому значению - PullRequest
0 голосов
/ 18 сентября 2018

Как мне разобрать файл * .INI, который имеет значение ключа как ключ к другому значению, используя C #?

Пример:

[PROJECT]
SUBPROJECT={$PROJECT_NAME_{$INI-FILE-DEFAULT-NAME$}$}_subproject
PROJECT_NAME_109={$INI-FILE-DEFAULT-NAME$}
INI-FILE-DEFAULT-NAME=109

Explication:

[section]
key= {$value$}
{$value$} = {$value2$}
{$value2$} = text

Я не могу получить текст от ключа "value2".С моей текущей реализацией я могу получить только текст из ключа "value".Я хочу получить текст из ключа "value2" и поместить его в ключ "key", анализируя каждую клавишу.

Ожидаемый:

[PROJECT]
SUBPROJECT=109_subproject
PROJECT_NAME_109=109
INI-FILE-DEFAULT-NAME=109

Файл грамматики Antlr:

grammar StatusFile;

/*
 * Parser Rules
 */
file: (ini)+ EOF
    ;

ini : section (option)* 
    ;

section : STRING eol+                                                   
        ;

option : key '=' value* eol+                # assign
       ; 

eol :  WS
    ;

key : STRING
    ;

value : OPEN_ACOLADE value* CLOSE_ACOLADE               #Token
      | STRING                                          #String
      ;

WS : ( '\r\n' )+;

OPEN_ACOLADE : '{$' ;
CLOSE_ACOLADE : '$}' ;

STRING  : ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '/' | '\\' | ':' | '*' 
            | '.' | ',' | ' ' | '-' | '<' | '>' | '!' | '+' | '"' | '#' | '(' | ')' 
            | '?' | '%' | '&' | '[' | ']' | '|' | ';' | '\'' | '~' | '^' | '`' )+ ;

1 Ответ

0 голосов
/ 19 сентября 2018

У меня есть INI-библиотека , которая имеет эту функцию, я называю это привязкой значений, но вместо {$NAME$} она использует @{NAME} заполнителей.

Например, для следующегоСодержимое INI:

[PROJECT]
PROJECTNAME109=@{INIFILEDEFAULTNAME}
INIFILEDEFAULTNAME=109

И следующий код C #:

var ini = new IniFile();
ini.Load("sample.ini");

ini.ValueBinding.Bind();

foreach (var sec in ini.Sections)
    foreach (var key in sec.Keys)
        Console.WriteLine("{0}={1}", key.Name, key.Value);

Результат:

PROJECTNAME109=109
INIFILEDEFAULTNAME=109

Однако в настоящее время он не позволяет использовать имена заполнителейс символами '-' (только буквы), и в настоящее время он не обрабатывает вложенные заполнители (например, @{NAME@{NAME}}).
Но тем не менее, дайте мне знать, если вы заинтересованы в использовании его в качестве решения, и я добавлюподдержка этого тоже.

...