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.
}
}
私が何か間違ったことをしている場合は私に知らせてください、私はこれについていくつかのアドバイスが欲しいです。