gpt4 book ai didi

c# - 使用 C# 标记自定义文本文件格式文件

转载 作者:太空狗 更新时间:2023-10-30 01:25:59 26 4
gpt4 key购买 nike

我想解析一种基于文本的文件格式,它的语法有点古怪。以下是一些有效的示例行:

<region>sample=piano C3.wav key=48 ampeg_release=0.7 // a comment here
<region>key = 49 sample = piano Db3.wav
<region>
group=1
key = 48
sample = piano D3.ogg

我认为想出一个能理解这一点的正则表达式对我来说太复杂了,但我想知道是否有一种不用编写自己的解析器就可以对这种类型的输入进行标记的好方法?即我想要读取上述输入并吐出“ token ”流的东西,例如,我的示例格式开头的输出类似于:

new Region(), new Sample("piano C3.wav"), new Key("48"), new AmpegRelease("0.7"), new Region()

是否有好的库/教程可以为我指明正确的方向,以优雅的方式实现它?

更新:我用 Irony 试过了,但我需要解析的语法怪癖(特别是 sample= 后面的数据可以在其中包含一个空格这一事实)导致他们建议我基于 String.Split 编写自己的代码可能会更好。参见讨论 here .

最佳答案

对于这种类型的东西,我会得到轻巧但坚固的 CoCo/R .如果您向我展示更多示例输入,我可能会想出一个语法起点。


I've used lex and yacc before, so I have some parsing experience. – Mark Heath 17 mins ago

那么你很幸运:我在 Fedora 的 soundfont-utils 包中找到了 sfz 的 lex 语法。该包包含 sfz2pat util .您可以在此处获取(源)包:

http://rpmfind.net//linux/RPM/fedora/14/i386/soundfont-utils-0.4-10.fc12.i686.html (src.rpm)

根据快速调查,最新版本的语法是从 2004 年 11 月开始的,但非常详细(sfz2pat.l 中的 58k)。下面是一个示例:

%option noyywrap
%option nounput
%option outfile = "sfz2pat.c"

nm ([^\n]+".wav"|[^ \t\n\r]+|\"[^\"\n]+\")
ipn [A-Ga-g][#b]?([0-9]|"-1")

%s K

%%

"//".* ;

<K>"<group>" {
int i;
leave_region();
leave_group();
if (!enter_group()) {
SFZERR
"Can't start group\n");
return 1;
}
am_in_group_scope = TRUE;
for (i = FIRST_SFZ_PARM; i < MAX_SFZ_PARM; i++) group_parm[i] = default_parm[i];
for (i = 0; i < MAX_FLOAT_PARM; i++) group_flt_parm[i] = default_flt_parm[i];
group_parm[REGION_IN_GROUP] = current_group;
BEGIN(0);
}
<K>"<region>" {
int i;
if (!am_in_group) {
SFZERR
"Can't start region outside group.\n");
return 1;
}
leave_region();
if (!enter_region()) {
SFZERR
"Can't start region\n");
return 1;
}
am_in_group_scope = FALSE;
for (i = 0; i < MAX_SFZ_PARM; i++) region_parm[i] = group_parm[i];
for (i = 0; i < MAX_FLOAT_PARM; i++) region_flt_parm[i] = group_flt_parm[i];
BEGIN(0);
}
<K>"sample="{nm} {
int i = 7, j;
unsigned namelen;
if (yytext[i] == '"') {
i++;
for (j = i; j < yyleng && yytext[j] != '"'; j++) ;
}
else j = yyleng;
namelen = (unsigned)(j - i + 1);
sfzname = strncpy( (char *)malloc(namelen), yytext+i, (unsigned)(j-i) );
sfzname[j-i] = '\0';
for (i = 0; i < (int)namelen; i++) if (sfzname[i] == '\\') sfzname[i] = '/';
SFZDBG
"Sample name is \"%s\"", sfzname);
SFZNL
if (read_sample(sfzname)) {
#ifndef LOADER
fprintf(stderr, "\n");
#endif
return 0;
}
BEGIN(0);
}
[...snip...]

关于c# - 使用 C# 标记自定义文本文件格式文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5923895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com