1

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

1 回答 1

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"

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

于 2014-09-19T05:47:24.903 回答