grammar
  • pegjs
  • ambiguous-grammar
  • 2014-10-30 73 views 2 likes 
    2

    我需要在謂詞的幫助下創建一個語法。下面的語法在給定的情況下失敗。PEGJS謂詞語法

    startRule = a:namespace DOT b:id OPEN_BRACE CLOSE_BRACE {return {"namespace": a, "name": b}} 
    
    namespace = id (DOT id)* 
    DOT = '.'; 
    OPEN_BRACE = '('; 
    CLOSE_BRACE = ')'; 
    id = [a-zA-Z]+; 
    

    它無法給定的輸入爲

    com.mytest.create(); 
    

    這應該給「創造」在結果部分「姓名」鍵的值。

    任何幫助將是偉大的。

    回答

    1

    這裏有幾件事。

    最重要的是,你必須知道,PEG 是貪婪。這意味着您的(DOT id)*規則會匹配所有DOT ID序列,包括您在startRule中擁有的序列號爲DOT b:id

    這可以使用lookahead來解決。

    另一件事是,你必須記住使用join,因爲默認情況下它會返回每個字符作爲數組的成員。

    我還爲分號添加了一條規則。

    試試這個:

    start = 
        namespace:namespace DOT name:string OPEN_BRACE CLOSE_BRACE SM nl? 
        { 
         return { namespace : namespace, name : name }; 
        } 
    
    /* Here I'm using the lookahead: (member !OPEN_BRACE)* */ 
    namespace = 
        first:string rest:(member !OPEN_BRACE)* 
        { 
         rest = rest.map(function (x) { return x[0]; }); 
         rest.unshift(first); 
         return rest; 
        } 
    
    member = 
        DOT str:string 
        { return str; } 
    
    DOT = 
        '.' 
    
    OPEN_BRACE = 
        '(' 
    
    CLOSE_BRACE = 
        ')' 
    
    SM = 
        ';' 
    
    nl = 
        "\n" 
    
    string = 
        str:[a-zA-Z]+ 
        { return str.join(''); } 
    

    而且據我所知,我正確地分析該行。

    +1

    謝謝你的幫助,它的工作。我不知道pegjs是貪婪的。 – djadmin 2014-11-06 09:27:42

    相關問題