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

问题描述 投票:1回答:1

如何使用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”获取文本,并通过解析每个键将其放在键“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' | '/' | '\\' | ':' | '*' 
            | '.' | ',' | ' ' | '-' | '<' | '>' | '!' | '+' | '"' | '#' | '(' | ')' 
            | '?' | '%' | '&' | '[' | ']' | '|' | ';' | '\'' | '~' | '^' | '`' )+ ;
c# parsing recursion antlr4 ini
1个回答
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}})。 但是,如果您对使用它作为解决方案感兴趣,请告诉我,我也会为此添加支持。

© www.soinside.com 2019 - 2024. All rights reserved.