2

PLY を使用して Unrealscript 用のパーサーを作成していますが、(できれば) 設定した解析ルールの最後のあいまいさの 1 つに遭遇しました。

Unrealscript にはキーワード がありdefault、コンテキストに応じて使用方法が異なります。default通常のステートメント行では、次のように使用できます。

default.SomeValue = 3;  // sets the "default" class property to 3

もちろん、ステートメントのdefaultcase ラベルもあります。switch

switch (i) {
    case 0:
        break;
    default:
        break;
}

のステートメント ブロックdefaultであると考えられるものの中でラベルに遭遇すると、解析にあいまいさが生じます。case解析エラーが発生するファイルの例を次に示します。

入力

class Example extends Object;

function Test() {
    switch (A) {
        case 0:
            default.SomeValue = 3;    // OK
        default:                      // ERROR: Expected "default.IDENTIFIER"
            break;
    }
}

構文解析規則

競合するルールは次のとおりです。

すべてのルールはGitHubで完全に見ることができます。

default

def p_default(p):
    'default : DEFAULT PERIOD identifier'
    p[0] = ('default', p[3])

switch

def p_switch_statement(p):
    'switch_statement : SWITCH LPAREN expression RPAREN LCURLY switch_cases RCURLY'
    p[0] = ('switch_statement', p[3], p[6])


def p_switch_case_1(p):
    'switch_case : CASE primary COLON statements_or_empty'
    p[0] = ('switch_case', p[2], p[4])


def p_switch_case_2(p):
    'switch_case : DEFAULT COLON statements_or_empty'
    p[0] = ('default_case', p[3])


def p_switch_cases_1(p):
    'switch_cases : switch_cases switch_case'
    p[0] = p[1] + [p[2]]


def p_switch_cases_2(p):
    'switch_cases : switch_case'
    p[0] = [p[1]]


def p_switch_cases_or_empty(p):
    '''switch_cases_or_empty : switch_cases
                             | empty'''
    p[0] = p[1]

この競合を解決する方法についてのヘルプやガイダンスは大歓迎です! 前もって感謝します。

4

1 に答える 1