2

Ironyライブラリで文脈自由文法を使用して、ユーザーが入力したプレフィックス表記の論理式を解析しようとしています。これはクラスの割り当てのためのものなので、誰かがこれの専門家である場合は、もっと知りたいです。

次の形式のユーザー入力の論理式を受け入れる必要があります。

and P Q -- (meaning P ^ Q)
or P Q -- (meaning P v Q)
not P  -- (meaning ~P)
imp P Q -- (meaning P -> Q)

Ironyで実装している文脈自由文法を使用して、これらを式ツリーに解析しようとしています。私が使用している文脈自由文法は、BNFのここにあります。

<Expression> ::= <Not> | <And> | <Or> | <Implies> | <Identifier>
<Not>        ::= "not" <Expression>
<And>        ::= "and" <Expression> <Expression>
<Or>         ::= "or" <Expression> <Expression>
<Implies>    ::= "imp" <Expression> <Expression>

(<Identifier> is implemented as an IdentifierTerminal object).

以前、Ironyを使用して式を解析しましたが、何らかの理由で機能させることができません。式を入力するand P Qと、And非終端記号の一部ではなく、識別子終端記号として「and」を識別しているように見えます。私は何か明らかなことをしているかもしれませんが、それを理解することはできません。これが私が拡張した言語クラスです:

class LogicPrefix : Grammar
{
    public LogicPrefix()
        : base(false)
    {
        NonTerminal Expression = new NonTerminal("expression");
        NonTerminal Implies = new NonTerminal("implies");
        NonTerminal And = new NonTerminal("and");
        NonTerminal Or = new NonTerminal("or");
        NonTerminal Not = new NonTerminal("not");
        Terminal Identifier = new IdentifierTerminal("identifier");
        Root = Expression;

        Expression.Rule = And | Or | Not | Identifier;

        Not.Rule = "not" + Expression;
        Implies.Rule = "imp" + Expression + Expression;
        And.Rule = "and" + Expression + Expression;
        Or.Rule = "or" + Expression + Expression;

    }
}

そして、これが私のドライバークラスです:

class Program
{
    static void Main(string[] args)
    {
        LogicPrefix grammar = new LogicPrefix();
        Parser p = new Parser(grammar);
        ParseTree pt = p.Parse("and P Q");
        //pt has thrown an error flag.
    }
}

私が何か間違ったことをしている場合は私に知らせてください、私はこれについていくつかのアドバイスが欲しいです。

4

1 に答える 1

3

IdentifierTerminal定義上、「アンダースコアまたは文字で始まり、文字、数字、およびアンダースコアのみを含む」ものはすべて認識されるため、識別子の字句解析により、他の端末を識別子として字句解析できるように見えます(ソース)。これは、プログラムがを読み取るときにand、それを識別子andまたはキーワードとして読み取ることができることを意味しますand

次の行で演算子を句読点として宣言することで、これを修正できるように見えます。

MarkPunctuation("imp", "and", "or", "not")
于 2012-11-08T05:41:34.670 に答える