实现使用倒反前缀符号表达式分析器(Implementing a prefix notation ex

2019-08-02 10:44发布

我试图解析使用上下文无关文法与反讽库用户输入的前缀符号逻辑表达式。 这是一个课堂作业,所以如果有人恰好是这方面的专家,我很想知道更多。

我需要接受如下格式的用户输入的逻辑表达式:

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.
    }
}

请让我知道,如果我做错事,我很乐意在此方面的建议。

Answer 1:

你标识符词法似乎让因为根据定义,你的其他终端进行lexed作为标识符IdentifierTerminal承认任何“打头的下划线或字母,并且只包含字母,数字和下划线”( 来源 )。 这意味着,当你的程序读取and ,它可以读取它作为标识符and或关键字and

它看起来像你对我可以通过声明你的运营商是标点符号使用以下行解决这个问题:

MarkPunctuation("imp", "and", "or", "not")


文章来源: Implementing a prefix notation expression parser using Irony