我刚开始编写DSL并希望使用JISON(http://zaach.github.io/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
答案 0 :(得分:2)
您可能只需要修剪引号:
\"[^"]+\" 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"
因此重新处理字符串非常常见,而不仅仅是删除分隔符。这可以使用开始条件一次完成一个字符(序列),也可以在单独的后处理操作中完成。