我想为允许转义标记分隔符的标记语言创建 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 */
{ $$ = []; }
;