簡體   English   中英

精神:在開始時允許角色,但不能在中間

[英]Spirit: Allowing a character at the begining but not in the middle

我正在努力為JavaScript標識符編寫一個解析器,到目前為止,這就是我所擁有的:

// 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"

但是我遇到了錯誤的標識符之一: 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時不失敗。

我想念的是什么?

您不需要解析器需要使用所有輸入。

當規則在$符號之前停止匹配時,它會成功返回,因為沒有什么說不能在$符號后面跟隨。 因此,您想斷言它后面沒有一個可能是標識符一部分的字符:

identifier_ = identifier_start
    >> 
    *(
        identifier_part >> -(qi::char_(".") > identifier_part)                      
     ) >> !identifier_start
;

一個相關的指令distinct Qi存儲庫: http : //www.boost.org/doc/libs/1_55_0/libs/spirit/repository/doc/html/spirit_repository/qi_components/directives/distinct.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM