如何在JISON中定义字符串

时间:2014-09-18 21:22:24

标签: bison dsl context-free-grammar jison

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

1 个答案:

答案 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"

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