我试图使用Lex和Yacc解析以下字符串输入但没有成功。
“@ user;一些随机文本; @another用户;其他一些随机文本”
我使用以下语法:
/* Lambda calculus grammar by Zach Carter */
%lex
%%
\s*\n\s* {/* ignore */}
";" { return 'SEP'; }
"@" { return 'AT'; }
[a-zA-Z]+ { return 'VAR'; }
<<EOF>> { return 'EOF'; }
/lex
%%
file
: expr EOF
{ return $expr; }
| EOF
;
expr
: AT expression
| expression
| SEP expression
;
expression
: VAR
{ $$ = yytext; }
;
您可以尝试使用此语法here:
我想要的结果是:
“@ user;一些随机文本; @another用户;其他一些随机文本”
输出:
用户一些
随机文字
另一位用户
其他一些随机文字
答案 0 :(得分:1)
“没有成功”或“不起作用”并不像对出错的确切描述那样有用。你的“输出”是错误的结果,或者你想看到什么(如果是后者,那么“用户有些”应该是单个实体的建议有点奇怪)?很难猜出你的语言的结构究竟是什么意思来自你的问题,而你的语法中没有任何递归结构表明问题可能是“无法创建语法生成器将接受”到“错误”输出”。所以,这个答案可能是错误的,但也许它会引出更好的描述。
/* Lambda calculus grammar by Zach Carter */
%lex
%%
\s*\n\s* /* ignore */
\s+ /* ignore */
";" { return 'SEP'; }
"@" { return 'AT'; }
[a-zA-Z]+ { return 'VAR'; }
<<EOF>> { return 'EOF'; }
/lex
%%
file
: things EOF
{ return $things; }
| EOF
;
things // can there be zero things?
: thing morethings
;
morethings
: SEP things
|
;
thing
: AT VAR
| text
;
text
: VAR moretext
;
moretext
: VAR moretext
|
;