使用Irony实现前缀表示法表达式解析器

时间:2012-11-08 05:21:24

标签: c# expression-trees prefix irony

我正在尝试使用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时,它似乎将“和”识别为标识符终端,而不是和非终结符号的一部分。我可能会做一些显而易见的事情,但我根本无法理解。这是我扩展的语言课程:

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

如果我做错了,请告诉我,我会对此提出一些建议。

1 个答案:

答案 0 :(得分:3)

您的标识符lexing似乎允许您的其他终端作为标识符被列为lexed,因为根据定义IdentifierTerminal可识别“以下划线或字母开头且仅包含字母,数字和下划线”的任何内容({{3} })。这意味着当您的程序读取and时,它可以将其读作标识符and或关键字and

在我看来,您可以通过使用以下行声明操作符标点符号来解决此问题:

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