我试图解析使用上下文无关文法与反讽库用户输入的前缀符号逻辑表达式。 这是一个课堂作业,所以如果有人恰好是这方面的专家,我很想知道更多。
我需要接受如下格式的用户输入的逻辑表达式:
and P Q -- (meaning P ^ Q)
or P Q -- (meaning P v Q)
not P -- (meaning ~P)
imp P Q -- (meaning P -> Q)
我试图将这些解析为使用我执行反讽上下文无关文法表达式树。 上下文无关文法我使用的是在这里,在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).
我用反讽来分析之前表达式,但出于某种原因,我不能得到它的工作。 当I型表达and PQ
它似乎是识别“和”作为标识符端,而且非末端的不一部分。 我可能会做一些很明显,但我根本无法弄明白。 这里是语文课我扩展:
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.
}
}
请让我知道,如果我做错事,我很乐意在此方面的建议。