2012-11-08 4 views
2

아이러니 라이브러리로 문맥 자유 문법을 사용하여 사용자 입력 접두사 표기법 논리 표현식을 구문 분석하려고합니다. 이것은 수업 과제를위한 것입니다. 만약 누군가이 일에 대해 전문가가되면, 저는 더 많이 알고 싶습니다. 나는 아이러니에 구현하고있어 문맥 자유 문법을 사용하여 식 트리에 이러한 구문 분석을 시도하고있어아이러니를 사용하여 접두사 표기법 구문 분석기 구현

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

, 나는 그것이 동작하지 않습니다. and P Q이라는 표현식을 입력하면 식별자 터미널로 "및"을 식별하는 것으로 보이며 Andterminal의 일부가 아닙니다. 나는 명백한 것을하고 있을지도 모른다. 그러나 나는 그것을 간단히 이해할 수 없다. 여기에 내가 확장 된 언어 클래스입니다 : 여기

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

제가 뭔가 잘못하고 있어요 경우 알려 주시기 바랍니다, 나는이에 대한 몇 가지 조언을 싶어요.

답변

3

식별자 lexing은 다른 단말기가 식별자로 어휘를 사용하는 것처럼 보입니다. 정의에 따라 IdentifierTerminal은 "밑줄이나 문자로 시작하고 문자, 숫자 및 밑줄 만 포함"(source)을 인식합니다. 즉, 프로그램이 and을 읽을 때 식별자 and 또는 키워드 and으로 읽을 수 있습니다. 그것을했다

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

그래, :

당신이 다음 줄에 문장 부호로 당신의 연산자를 선언함으로써이 문제를 해결할 수있는 것처럼 나에게 보이는

! 감사. 또한 And, Or, Not 및 Implies에 대한 규칙에서 공백을 제거해야했습니다. 그건 내 잘못이야. –