2013-10-27 1 views
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' 

무엇이 잘못 되었나요? 그 문법/렉서에서

답변

1

아무것도 (단지 알파벳입니다) NTOK을 제외하고 일반 텍스트를지지 않습니다. 따라서 aNTOK으로 구문 분석되며, NTOK을 허용하는 유일한 제품은 EOF이어야합니다. 나는 파서가 많은 것들을 기대하고 있다고 가정하고 EOF은 문법 압축의 결과이다.

관련 문제