【问题标题】:Parse user name and strings解析用户名和字符串
【发布时间】:2014-02-04 19:47:01
【问题描述】:

我正在尝试使用 Lex 和 Yacc 解析以下字符串输入,但没有成功。

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

我正在使用以下语法:

/* 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;一些随机文本;@另一个用户;一些其他随机文本"

输出:

用户一些

随机文本

另一个用户

其他一些随机文本

【问题讨论】:

  • “你可以在这里试试这个语法”。呃……不,因为AT is not defined.
  • @Louis 这是我遇到的问题之一。如果您查看 lex 关键字,"@" { return AT; } 定义明确
  • 了解 yacc/lex、bison/flex 有助于使用 jison,但 jison 并不是 bison(或 yacc 或其他任何东西)的替代品。吉森是它自己的东西。因此,适用于这些其他工具的东西不适用于 jison,包括return AT。令人费解的是,你使用的是return 'VAR',而不是return VAR,那为什么是return AT
  • 啊,很好看。这是固定的,但它仍然不起作用:(

标签: javascript parsing yacc lex jison


【解决方案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
  |
  ;    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多