3

次の構文で複数行の生産を定義する方法はありますか? PLY は : 行ごとに 1 つの生産を意味する ID の前に期待します。

def p_envvar(p):
   ''' 
   envvar : EV                    \
            ID                    \
            COLON                 \ 
            INT_VAL               \ 
            BOX_OPEN              \ 
            INT_VAL               \ 
            SEP                   \ 
            INT_VAL               \ 
            BOX_CLOSE             \ 
            STRING_VAL            \ 
            INT_VAL               \ 
            INT_VAL               \ 
            DUMMY_NODE_VECTOR     \ 
            comma_identifier_list \ 
            SEMICOLON              
   '''
4

2 に答える 2

2

代替ルールを区切るには「パイプ」を使用する必要があります。

def p_envvar(p):
    ''' 
    envvar : EV
           | ID
           | COLON
           | INT_VAL
           | BOX_OPEN
           | INT_VAL
           | SEP
           | INT_VAL
           | BOX_CLOSE
           | STRING_VAL
           | INT_VAL
           | DUMMY_NODE_VECTOR
           | comma_identifier_list
           | SEMICOLON  
    '''

しかし、非常に多くの代替を使用すると、おそらく単純化する必要があることがわかります (同じ状態に単純化するさまざまな関数を宣言できます。

def p_envar_ev():
    """envvar : EV"""

def p_envvar_id():
    """envvar : ID"""

...など。可能性のある各ケースを処理するために大きなifブロックを使用するよりも読みやすいです。

于 2013-11-20T21:39:07.053 に答える
0

long を理解できるdocstringように複数の行に広げる方法があります。PLY

def p_expr(p):
    ("""process_type : this is a very long """
     """ production rule """
     """ that does not fit on a single line """)

この魔法の功績は、この の OP にあります括弧に注目してください: 括弧はPEP 8\に準拠しているため、でエスケープするよりもはるかに優れているため、構文チェッカーは文句を言いません。

于 2014-04-11T08:09:02.703 に答える