如何在JISON中定义字符串



我刚开始编写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"

因此,重新处理字符串是非常常见的,而不仅仅是删除分隔符。这可以在有开始条件的情况下一次完成一个字符(序列),也可以在单独的后处理操作中完成。

相关内容

  • 没有找到相关文章

最新更新