gpt4 book ai didi

c++ - 弹性和 Bison : parse string without quotes

转载 作者:行者123 更新时间:2023-11-30 04:12:01 25 4
gpt4 key购买 nike

我正在使用 flex + bison c++ 开发 mgf 文件解析器(语法:http://www.matrixscience.com/help/data_file_help.html)。

我已经实现了词法分析器 (lex) 和解析器 (yacc)。但我有一个无法解决的问题:当我尝试解析字符串时。

重要:字符串周围没有 ' 或 "。

这是一个输入示例:

CHARGE=1+, 2+ and 3+
#some comments

BEGIN IONS
TITLE= Cmpd 1, +MSn(417.2108), 10.0 min //line 20
PEPMASS=417.21083 35173
CHARGE=3+
123.79550 20
285.16455 56
302.14335 146 1+
[other datas ...]
END IONS

BEGIN IONS
[an other one ... ]

这里是(最小的)词法分析器:MGF_TOKEN_DEBUG 只是一个打印一行的宏

#define MGF_TOKEN_DEBUG(val) std::cout<<"token: "<<val<<std::endl

\n {
MGF_TOKEN_DEBUG("T_EOL");
return token::T_EOL;
}

^[#;!/][^\n]* {
MGF_TOKEN_DEBUG("T_COMMENT");
return token::T_COMMENT;
}

[[:space:]] {}

/** values **/
[0-9]+ {
MGF_TOKEN_DEBUG("V_INTEGER"<<" (="<<yytext<<")");
return token::V_INTEGER;
}

[0-9]+"."[0-9]* {
MGF_TOKEN_DEBUG("V_DOUBLE"<<" (="<<yytext<<")");
return token::V_DOUBLE;
}

[0-9]+("."[0-9]+)?[eE][+-][0-9]+ {
MGF_TOKEN_DEBUG("V_DOUBLE"<<" (="<<yytext<<")");
return token::V_DOUBLE;
}

"+" {
MGF_TOKEN_DEBUG("T_PLUS");
return token::T_PLUS;
}


"=" {
MGF_TOKEN_DEBUG("T_EQUALS");
return token::T_EQUALS;
}

"," {
MGF_TOKEN_DEBUG("T_COMA");
return token::T_COMA;
}

"and" {
MGF_TOKEN_DEBUG("T_AND");
return token::T_AND;
}
/*** keywords */
^"CHARGE" {
MGF_TOKEN_DEBUG("K_CHARGE");
return token::K_CHARGE;
}

^"TITLE" {
MGF_TOKEN_DEBUG("K_TITLE");
return token::K_TITLE;
}
[ others keywords ...]

/**** string : problem here **/
[A-Za-z]([:;,()A-Za-z0-9_.-]|[[:space]])* {
MGF_TOKEN_DEBUG("V_STRING"<<" (="<<yytext<<")");
return token::V_STRING;
}

和(最小化的)解析器。

start : headerparams blocks T_END;

headerparams : /* empty */| headerparams headerparam;

headerparam : K_CHARGE T_EQUALS charge_list T_EOL | [others ...];

blocks : /* empty */ | blocks block;

block : T_BEGIN_IONS T_EOL blockparams ions T_END_IONS T_EOL| T_BEGIN_IONS T_EOL blockparams T_END_IONS T_EOL;

blockparam : K_CHARGE T_EQUALS charge T_EOL | K_TITLE T_EQUALS V_STRING T_EOL | [others...];

ion : number number T_EOL| number number charge T_EOL;

ions : ions ion| ion;

number : V_INTEGER | V_DOUBLE;

charge : V_INTEGER T_PLUS | V_INTEGER T_MINUS;

charge_list : charge| charge_list T_COMA charge | charge_list T_AND charge;

我的问题是我得到了下一个 token :

[...]
[line 20]
token: K_TITLE
token: T_EQUALS
token: v_STRING (= Cmpd)
token: V_INTEGER (= 1)
Error line 20: syntax error, unexpected integer, expecting end of line

我想要:

[...]
[line 20]
token: K_TITLE
token: T_EQUALS
token: v_STRING (Cmpd 1, +MSn (417.2108), 10.0 min)
token: T_EOL

如果有人能帮助我...


编辑#1我已经使用标记的串联“解决”了问题:

语法:

[A-Za-z][^\n[:space:]+-=,]* {
MGF_TOKEN_DEBUG("V_STRING"<<" (="<<yytext<<")"))
return token::V_STRING;t
}

亚克:

   string_st : V_STRING
| string_st V_STRING
| string_st number
| string_st T_COMA
| string_st T_PLUS
| string_st T_MINUS
;

blockparam : K_CHARGE T_EQUALS charge T_EOL | K_TITLE T_EQUALS string_st T_EOL | [others...];

最佳答案

如果您的字符串总是以一些文本 TITLE 开始并以一些文本 \n 结束(新行字符)
我建议你使用 start conditions ,

%x IN_TITLE

"TITLE" { /* return V_STRING of TITILE in c++ code */ BEGIN(IN_TITLE); }
<IN_TITLE>= { /* return T_EQUALS in c++ code */; }
<IN_TITLE>"\n" { BEGIN(INITIAL); }
<IN_TITLE>.* { MGF_TOKEN_DEBUG("V_STRING"<<" (="<<yytext<<")");return token::V_STRING; }

%x IN_TITLE 定义了 IN_TITLE 状态,模式文本 TITLE 将启动它。一旦开始,\n 将让它回到初始状态(INITIAL 是预定义的),并且所有其他字符将被消耗到 V_STRING 而无需任何特定操作。

关于c++ - 弹性和 Bison : parse string without quotes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20002529/

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