0

我正在尝试使用 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; }
  ;

你可以在这里试试这个语法:

我想要的结果是:

"@user;一些随机文本;@another 用户;一些其他随机文本"

输出:

用户一些

随机文本

另一个用户

其他一些随机文本

4

1 回答 1

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
  |
  ;    
于 2014-02-15T21:22:59.527 回答