2013-03-19 6 views
1

간단한 bool 식을 구문 분석 할 문법을 만들려고합니다.
여러 표현식이있는 경우 문제가 발생합니다.
1..nand/or 개의 표현식을 구문 분석 할 수 있어야합니다.ParseKit 문법을 사용하여 간단한 부울 식 언어를 구문 분석하는 방법

아래의 각 예는 완전한 표현 :

  1. (myitem.isavailable("1234") or myitem.ispresent("1234")) and myitem.isready("1234")
  2. myitem.value > 4 and myitem.value < 10
  3. myitem.value = yes or myotheritem.value = no

문법 :

@start = conditionalexpression* | expressiontypes; 

conditionalexpression = condition expressiontypes; 

expressiontypes = expression | functionexpression; 

expression = itemname dot property condition value; 

functionexpression = itemname dot functionproperty; 

itemname = Word; 

propertytypes = property | functionproperty; 

property = Word; 

functionproperty = Word '(' value ')'; 

value = Word | QuotedString | Number; 

condition = textcondition; 

dot = '.'; 

textcondition = 'or' | 'and' | '<' | '>' | '='; 

답변

1

개발자는 ParseKit입니다. ,

  1. 내가 언어가 간단 것을 깨달았다 :

    @start = expr; 
    
    expr = orExpr; 
    
    orExpr = andExpr orTerm*; 
    orTerm = 'or' andExpr; 
    
        // 'and' should bind more tightly than 'or' 
    andExpr = relExpr andTerm*; 
    andTerm = 'and' relExpr; 
    
        // relational expressions should bind more tightly than 'and'/'or' 
    relExpr = callExpr relTerm*; 
    relTerm = relOp callExpr; 
    
        // func calls should bind more tightly than relational expressions 
    callExpr = primaryExpr ('(' argList ')')?; 
    argList = Empty | atom (',' atom)*; 
    
    primaryExpr  = atom | '(' expr ')'; 
    atom   = obj | literal; 
    
        // member access should bind most tightly 
    obj  = id member*; 
    member = ('.' id); 
    
    id  = Word; 
    literal = Number | QuotedString | bool; 
    bool = 'yes' | 'no'; 
    
    relOp = '<' | '>' | '='; 
    

    당신에게 나는이 문법에 도착하는 방법에 대한 아이디어를 제공하려면 :

    다음은 귀하의 예제 입력과 일치하는 ParseKit 문법이다 구성 가능 표현입니다.

  2. XPath 1.0은 쉽게 사용할 수 있고 읽을 수있는 문법이있는 비교적 간단한 표현식 언어라는 것을 기억했습니다.
  3. XPath 1.0 spec online을 방문하여 XPath 기본 언어 문법을 신속하게 검사했습니다. 이를 통해 귀하의 언어 문법을 빠르게 이해할 수 있습니다. 경로 표현식 XPath 표현식 부분을 무시하면 XPath는 기본 표현식 언어에 대한 아주 좋은 템플릿입니다.

위의 문법은 모든 예제 입력을 성공적으로 구문 분석합니다 (아래 참조). 희망이 도움이됩니다.

[foo, ., bar, (, "hello",), or, (, bar, or, baz, >, bat,)]foo/./bar/(/"hello"/)/or/(/bar/or/baz/>/bat/)^ 
[myitem, ., value, >, 4, and, myitem, ., value, <, 10]myitem/./value/>/4/and/myitem/./value/</10^ 
[myitem, ., value, =, yes, or, myotheritem, ., value, =, no]myitem/./value/=/yes/or/myotheritem/./value/=/no^ 
+0

새 소식 나는 뭔가가 빠졌습니다. 나는 콜백 셋업을 가지고 있으며, 어셈블리를 출력 할 때리스트를 통해 포인터가 움직이는 것을 볼 수있다.하지만 표현의 끝 부분에 도달해도 여전히 콜백을 내고 최종 콜백은 완성 된 어셈블리가 아니다. 구문 분석이 표현식의 끝에 도달하면 어떻게 감지합니까? – user2187880

+0

ParseKit 개발자가 여기 있습니다. 나는 이전에이 질문에 대답했다 : http://stackoverflow.com/a/10046316/34934 –

+0

위의 무시 - 나는 괄호에 포함 된 표현에 따라 다양한 결과를 얻고있다. 가장 바깥 쪽의 괄호가 필요하지 않게하려면 어떻게해야합니까? – user2187880