1

これまでのところ、これが私が持っているものです:

// All this rules have string as attribute.
identifier_ = identifier_start
    >> 
    *(
        identifier_part >> -(qi::char_(".") > identifier_part)                      
     )
;
identifier_part = +(qi::alnum | qi::char_("_"));
identifier_start = qi::char_("a-zA-Z$_");

このパーサーは、テストの「適切な識別子」のリストに対して正常に機能します。

"x__",
"__xyz",
"_",
"$",
"foo4_.bar_3",
"$foo.bar",
"$foo",
"_foo_bar.foo",
"_foo____bar.foo"

しかし、私は悪い識別子の 1 つに問題があります: foo$bar。これは失敗するはずですが、成功しました!! また、sintetized 属性の値は です"foo"

のデバッグ出力は次のfoo$barとおりです。

<identifier_>
    <try>foo$bar</try>
    <identifier_start>
        <try>foo$bar</try>
        <success>oo$bar</success>
        <attributes>[[f]]</attributes>
    </identifier_start>
    <identifier_part>
        <try>oo$bar</try>
        <success>$bar</success>
        <attributes>[[f, o, o]]</attributes>
    </identifier_part>
    <identifier_part>
        <try>$bar</try>
        <fail/>
    </identifier_part>
  <success>$bar</success>
  <attributes>[[f, o, o]]</attributes>
</identifier_>

私が望むのは、パーサーが解析時に失敗するが、解析時に失敗しfoo$barないこと$foobarです。

私は何が欠けていますか?

4

1 に答える 1