使用C#的Antlr4-ini解析器-解析作为另一个值的键的键的值

时间:2018-09-18 14:17:30

标签: c# parsing recursion antlr4 ini

如何使用C#解析具有键值的* .INI文件作为另一个值的键?

示例:

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

说明:

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

我无法从键“ value2”中获取文本。 在当前的实现中,我只能从键“值”中获取文本。我想从键“ value2”中获取文本,并通过解析每个键将其放在键“键”中。

预期:

[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 :(得分:0)

我有一个具有此功能的INI library,我称其为值绑定,但是它不是{$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}})。
但是,尽管如此,让我知道您是否有兴趣将其用作解决方案,我也会对此提供支持。