Jison解析器可能无法正确标记。 (我认为)

时间:2013-10-27 22:38:28

标签: bison lex jison

已经有一段时间了,因为我已经与Flex或Bison做过任何工作,回到大学。但是,我一直在尝试使用Jison推出自己的light-BBCode解析器,以此作为周末的努力。

我的问题涉及一个奇怪的问题,我告诉解析器正在寻找一个它没有找到先决条件令牌的令牌。我不认为我解释得那么好(或者我理解实际发生了什么),所以这是代码:

%lex
%%

\s+         /* Consume whitespace */
"[b"        {return 'BOLD';}
"[i"        {return 'ITAL';}
"[s"        {return 'STRIKE';}
"[url="     {return 'URLEQ';}
"[url"      {return 'URL';}
"[img"      {return 'IMG';}
"[quote"    {return 'QUOT';}
"[code"     {return 'CODE';}
"[style"\s+"size="    {return 'STYLSIZ';}
"[style"\s+"color="   {return 'STYLCOL';}
"[color="    {return 'COL';}
"[list"     {return 'LIST';}
"[table"    {return 'TABLE';}
"[tr]"       {return 'TROW';}
"[td]"       {return 'TDEL';}

"[*]"       {return 'LITEM';}

"]"         {return 'CLOSE';}

"[/b]"      {return 'BOLDEND';}
"[/i]"      {return 'ITALEND';}
"[/s]"      {return 'STRIKEEND';}
"[/url]"    {return 'URLEND';}
"[/quote]"  {return 'QUOTEND';}
"[/code]"   {return 'CODEEND';}
"[/style]"  {return 'STYLEND';}
"[/color]"  {return 'COLEND';}
"[/list]"   {return 'LISTEND';}
"[/table]"  {return 'TABLEEND';}
"[/tr]"     {return 'TROWEND';}
"[/td]"     {return 'TDELEND';}
<<EOF>>     {return 'EOF';}
[a-zA-Z]+    {return 'NTOK';}

/lex

%start EXPR

%%

EXPR
    : CONTENT EOF { typeof console !== 'undefined' ? console.log($1) : print($1); return $1; }
    ;

CONTENT
    : BOLD CLOSE CONTENT BOLDEND            { $$ = "<b>"+$3+"</b>"; }
    | ITAL CLOSE CONTENT ITALEND            { $$ = "<i>"+$3+"</i>"; }
    | STRIKE CLOSE CONTENT STRIKEEND        { $$ = "<s>"+$3+"</s>"; }
    | URL CLOSE CONTENT URLEND              { $$ = "<a href=\""+$3+"\">"+$3+"</a>"; }
    | URLEQ NTOK CLOSE CONTENT URLEND       { $$ = "<a href=\""+$2+"\">"+$4+"</a>"; }
    | IMG CLOSE NTOK IMGEND                 { $$ = "<img src=\""+$3+"\"></img>"; }
    | QUOT CLOSE CONTENT QUOTEND            { $$ = "<blockquote>"+$3+"</b>"; }
    | CODE CLOSE CONTENT CODEEND            { $$ = "<pre>"+$3+"</b>"; }
    | STYLSIZ NTOK CLOSE CONTENT STYLEND    { $$ = "<span style=\"+$2+\">"+$4+"</b>"; }
    | STYLCOL NTOK CLOSE CONTENT STYLEND    { $$ = "<span style=\"color:"+$2+";\">"+$4+"</b>"; }
    | COL NTOK CLOSE CONTENT COLEND         { $$ = "<span style=\"color:"+$2+";\">"+$4+"</b>"; }
    | LIST CLOSE LITEMS LISTEND             { $$ = "<ul>"+$3+"</ul>"; }
    | TABLE CLOSE TDATA TABLEEND            { $$ = "<table>"+$3+"</table>"; }
    | NTOK
    ;

LITEMS
    : LITEM CONTENT LITEMS                  { $$ = "<li>"+$2+"</li>"; }
    ;

TDATA
    : TROW CLOSE CONTENT TROWEND            { $$ = "<tr>"+$3+"</tr>"; }
    | TDEL CLOSE CONTENT TDELEND            { $$ = "<td>"+$3+"</td>"; }
    ;

当我针对字符串运行时:

"a [b]Test, log 1 [/b] This is a story about a [url=\"http://google.com\"]person[/url]"

我收到错误:

Error: Parse error on line 1:
a [b]Test, log 1 [/b]
--^
Expecting 'EOF', 'BOLDEND', 'ITALEND', 'STRIKEEND', 'URLEND', 'QUOTEND', 'CODEEND', 'STYLEND', 'COLEND', 'LITEM', 'TROWEND', 'TDELEND', got 'BOLD'

非常感谢任何出错的人。

1 个答案:

答案 0 :(得分:1)

除了NTOK(只是字母)之外,该语法/词法分析器中的任何内容都不会接受普通文本。因此a被解析为NTOK,唯一允许NTOK的制作需要跟EOF。我认为解析器期待大量的事情以及EOF是语法压缩的结果。