これまでのところ、これが私が持っているものです:
// 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
です。
私は何が欠けていますか?