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

我正在尝试使用Irony库使用无上下文语法来解析用户输入的前缀表示法逻辑表达式。 这是一个课堂作业,所以如果有人恰好是这方面的专家,我很想知道更多。

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

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

我正在尝试使用我在Irony中实现的无上下文语法将这些解析为表达式树。 我正在使用的无上下文语法在BNF中:

  ::=  |  |  |  |   ::= "not"   ::= "and"    ::= "or"    ::= "imp"   ( is implemented as an IdentifierTerminal object). 

我之前使用过Irony来解析表达式但由于某种原因,我无法让它工作。 当我输入表达式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 PQ"); //pt has thrown an error flag. } } 

如果我做错了,请告诉我,我会对此有所建议。

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

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

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