我想爲允許轉義標記分隔符的標記語言創建Jison(Bison)語法。轉義字符語法
這將是有效的:
I like apples
I like [apples, oranges, pears]
I like [apples, oranges, pears] and [peanut butter, jelly]
I like [apples, oranges, pears] \[when they're in season\]
I like emoticons :-\]
的例子或許會作爲被解釋如下(以JSON表示):
["I like apples"]
["I like ", ["apples", "oranges", "pears"]]
["I like ", ["apples", "oranges", "pears"], " and ", ["peanut butter", "jelly"]]
["I like ", ["apples", "oranges", "pears"], " [when they're in season]"]
["I like emoticons :-]"]
脫逃[]\,
是最小的,但它可能是有道理的允許任何可打印的字符被轉義,即使不需要轉義也是如此。
如果轉義不可打印的字符不被支持,那會很好。也就是說,一行末尾的\
將是非法的。這可能免費與正則表達式.
,因爲它可能不包含換行符,但它也應該發生其他不可打印的字符。
是很困難的谷歌這一點,因爲它混合了很多成果在野牛定義逃逸文字字符等
什麼是支持的自定義野牛轉義字符最優雅的方式語言?
編輯
這裏是我到目前爲止and can be tested on Jison,但它不工作(只是返回1
如果有的話),我不認爲該文本將到達轉義 - 這將需要第二通過。這是可以避免的嗎?
/* description: markup */
/* lexical grammar */
%lex
%%
(\\.|[^\\\[])+ return 'TOPTEXT'
(\\.|[^\\\[\]\,])+ return 'TEXT'
\-?[0-9]+("."[0-9]+)?\b return 'NUMBER'
".."|"-" return '..'
"[" return '['
"]" return ']'
"," return ','
<<EOF>> return 'EOF'
/lex
%start markup
%%
markup
: template EOF
{ return $template; }
;
template
: template TOPTEXT
{ $$ = $template.push($TOPTEXT); }
| template dynamic
{ $$ = $template.push($dynamic); }
| /* empty */
{ $$ = []; }
;
dynamic
: '[' phraselist ']'
{ $$ = $phraselist; }
;
phraselist
: phraselist ',' phrase
{ $$ = $phraselist.push($phrase); }
| /* empty */
{ $$ = []; }
;
phrase
: TEXT
{ $$ = $phrase.push($TEXT); }
| phrase dynamic
{ $$ = $phrase.push($dynamic); }
| /* empty */
{ $$ = []; }
;
大推()!很好的建議,謝謝。但是我的期望是什麼應該避開那些逃脫的角色?它可以由詞法分析器來完成,還是需要一種逐字符處理字符的語法?或者是什麼? –
@uosɐs是的,我認爲這是詞法分析器處理轉義的工作。如果我明白你的意思,就是說,從token值中去掉反斜槓,你可能會得到類似'{yytext = yytext.replace(/\\(()),g''$ 1')的東西。返回'TEXT'; } - 字符串替換應用於令牌值。 – elias
這是一個很好的建議,我想我會一起去。我還發現這些鏈接提供了一種無需正則表達式即可實現它的方式。 http://zaach.github.com/jison/docs/#lexical-analysis http://dinosaur.compilertools.net/flex/flex_11.html http://flex.sourceforge.net/manual/How-do-I -expand-backslash_002descape-sequences-in-C_002dstyle-quoted-strings_003f.html –