0
나는 Flex 나 Bison과 함께 일한 이후로 대학에 다시 돌아왔다. 그러나 나는 주말에 재미로 Jison을 사용하여 나 자신의 light-BBCode 파서를 굴리기 위해 노력했다.Jison 파서가 올바르게 토큰 화되지 않았을 수 있습니다. (나는 생각한다)
내 문제는 내가 파서 그것을위한 전제 조건 토큰을 발견하지 않은 토큰을 찾고에게있어하는 이상한 문제를 포함한다. 나는 그 잘 설명 (또는 실제로 무슨 일이 일어나고 있는지 이해)하고있어 생각하지 않는다, 그래서 여기에 코드입니다 : 내가 실행하면
%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'
무엇이 잘못 되었나요? 그 문법/렉서에서