2014-09-18 45 views
0

我剛剛開始編寫DSL並希望使用JISON(http://zaach.github.io/jison)。我正在嘗試學習語法語法,並遇到用雙引號指定字符串的問題。如何在JISON中定義一個字符串

什麼我想會的工作是:

%lex 
%% 

[\n\s]+     /* skip whitespace */ 
"true"|"false"   return 'BOOL' 
"IF"     return 'START' 
"AND"|"OR"    return 'LOGIC' 
<<EOF>>     return 'EOF' 
.      return 'INVALID' 

/lex 

%start string 
%% 

string 
    : '"' [^"]+ '"' 
     {$$ = $2;} 
    ; 

...或者是:

%lex 
%% 

[\n\s]+     /* skip whitespace */ 
"true"|"false"   return 'BOOL' 
"IF"     return 'START' 
"AND"|"OR"    return 'LOGIC' 
\"[^"]+\"    return 'STRING' 
<<EOF>>     return 'EOF' 
.      return 'INVALID' 

/lex 

%start string 
%% 

string 
    : STRING 
     {$$ = $1;} 
    ; 

這第一(基本)不會在所有的工作,而第二個作品還挺;當它發現一個字符串時,出來的值包括逃脫的雙引號。

有沒有很好的資源可以幫助學習JISON/BISON/BNF語法定義?我一直在環顧四周,但一直未能找到任何有助於我的事情;不是comp/sci專業。我只是想念一些簡單的東西或更重要的東西?

對於一些背景:

我試圖定義一個簡單的DSL解析簡單的條件:

IF Something > 100 
AND Another == true 
    doAction 2.51 

回答

1

你可能只需要修剪報價:

\"[^"]+\"   yytext = yytext.slice(1,-1); return 'STRING' 

除了玩具語言之外,字符串通常比用引號括起來的一系列字符複雜得多。您通常至少要處理的某種形式的轉義特殊字符:

"A \t tab and a newline \n embedded in a \"string\"." 

或SQL/CVS風格報價轉義:

"Embedded ""quoted string"" in a quoted string." 

你甚至可能想要做的Perl/bash的風格變量替換。

"This gets really complicated: $ButSomePeopleLikeIt" 

因此,重新處理字符串是很常見的,而不僅僅是刪除分隔符。這可以通過啓動條件或單獨的後處理操作一次完成一個字符(序列)。

+0

謝謝。我正在嘗試使用'yytext.replace(/ \\「/ g,'')'這種方式,但最初並沒有工作,但是這是或者你認爲這是一種」正確「的方式來做這種野牛/ jison ?我覺得有點「哈克」這樣做,但如果它是如何完成,那麼我很好。 – kalisjoshua 2014-09-19 11:12:53

+0

@kalisjoshua我不知道有任何其他方式做到這一點;這當然是我會怎麼做'flex '(儘管在'flex'中你必須複製'yytext',所以你可能覺得它不那麼「哈哈」:))。 – rici 2014-09-19 16:34:38

相關問題