从BNF语法中导出状态机

时间:2009-11-05 23:55:59

标签: yacc bison bnf pushdown-automaton

我正在尝试将XSS安全字符串插值方案的概念证明放在一起。

给定一个带替换的字符串,

"Hello <b>$planetoid</b>!"

我希望将其分解为文字部分和替换("Hello<b>" planetoid "</b>!"),然后在文字部分上从左到右运行状态机。当我达到内插值(上面的planetoid)时,我需要能够从状态到达适当的转义函数。

有没有人知道如何使用lex / yacc / bison来派生状态机并能够将语法中的标签与输出状态相关联?我想派生一个状态机,我可以在javascript中使用它们,并尝试替换PHP的底层字符串实现。

我的理由是here

欢呼声, 麦克

3 个答案:

答案 0 :(得分:6)

通常,无法为可以用BNF表示的语法创建状态机。状态机只能识别常规语言,BNF可以指定无上下文的语言。 Yacc可以创建解析器。这就足够了吗?

答案 1 :(得分:0)

看起来我可以在语法中放置标记,所以如果我使用两种不同的生产类型,一种没有副作用,一种消耗字符,一种不消耗字符,但更新一个状态变量

ST_EXPECT_TAG_NAME : { state = TAG_NAME };
TAG_BODY
    : '<' ST_EXPECT_TAG_NAME TAG_NAME ATTRS SPACES '>' ST_OUT_OF_TAG
    ;

编译后的输出将状态名与switch语句

相关联
YY_REDUCE_PRINT (yyn);
switch (yyn)
  {
      case 118:
#line 74 "tmp/html-combo.y"
    { state = TAG_NAME ;}
    break;

可能有一种方法可以在不解析C的情况下提取表格,但我对yacc / bison一无所知。

答案 2 :(得分:0)

你可以使用yacc / bison。最初看看野牛很难说明你可以在哪里实现状态机。野牛的规则是左右解决的。即;如果您有一个派生rule1 rule2 rule3的规则(称为rule0),则按以下顺序调用操作:rule1,rule2,rule3,rule0。您可以使用全局状态机将其与规则的动态返回值组合在一起(我使用不同类型的联合,如字符串,int或甚至容器作为返回值)。