我刚开始编写DSL,想使用JISON(http://zaach.github.io/jison)。我正在努力学习语法,遇到了用双引号指定字符串的问题。
我认为可行的是:
%lex
%%
[ns]+ /* skip whitespace */
"true"|"false" return 'BOOL'
"IF" return 'START'
"AND"|"OR" return 'LOGIC'
<<EOF>> return 'EOF'
. return 'INVALID'
/lex
%start string
%%
string
: '"' [^"]+ '"'
{$$ = $2;}
;
或者:
%lex
%%
[ns]+ /* 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语法定义?我一直在四处寻找,但没有找到任何对我有帮助的东西;不是计算机科学专业的。我只是错过了一些简单的东西还是更实质的东西?
对于某些上下文:
我试图定义一个简单的DSL来解析简单的条件:
IF Something > 100
AND Another == true
doAction 2.51
您可能只需要修剪引号:
"[^"]+" 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"
因此,重新处理字符串是非常常见的,而不仅仅是删除分隔符。这可以在有开始条件的情况下一次完成一个字符(序列),也可以在单独的后处理操作中完成。