解析用户名和字符串

时间:2014-02-04 19:47:02

标签: javascript parsing yacc lex jison

我试图使用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用户;其他一些随机文本”

输出:

  

用户一些

     

随机文字

     

另一位用户

     

其他一些随机文字

1 个答案:

答案 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
  |
  ;