マークアップ区切り文字をエスケープできるマークアップ言語用の 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 :-]"]
のエスケープ[]\,
は最小限ですが、エスケープが不要な場合でも、印刷可能な文字をエスケープできるようにすることはおそらく理にかなっています。
印刷できない文字のエスケープがサポートされていないといいのですが。つまり\
、行末の a は不正です。正規表現.
には改行が含まれていない可能性があるため、これは無料である可能性がありますが、他の印刷できない文字でも発生するはずです。
Bison 定義などでリテラル文字をエスケープするための多くの結果と混同されているため、これをグーグルで検索するのは困難です。
Bison で定義された言語でエスケープ文字をサポートする最もエレガントな方法は何ですか?
編集
ここに私がこれまでに持っていて、 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 */
{ $$ = []; }
;