2017-01-02 6 views
1

this 튜토리얼을 따르려고하고 있으며 튜토리얼에 사용 된 문법을 pyparsing 문법으로 변환하는 데 어려움을 겪고 있습니다. 블로그의 요지는 사전 비교를 구문 분석하고 실행하기 위해 표현 언어를 작성하는 것입니다.자신의 클래스를 사용하여 pyparsing

properties = { 
    "name": "David Bowie", 
    "years_active2": 47 
} 

평가할 표현식 :

properties["name"] == "David Bowie" 

을 그들이 사용하는 문법은 다음과 같습니다

expr: literal      { return $1 } 
    | "properties" "[" literal "]" { return PropertyLookup($3) } 
    | expr "[" expr "]"   { return Index($1, $3) } 
    | expr "and" expr    { return And($1, $3) } 
    | expr "==" expr    { return Equals($1, $3) } 
    | expr ">" expr    { return GreaterThan($1, $3) } 
; 

literal: QUOTED_STRING { return Literal($1) } 
    | DECIMAL_NUMBER { return Literal($1) } 
; 

지금까지 내가 가지고 :

string_literal = pp.Word(pp.alphas, pp.alphanums) 
numeric_literal = pp.Word(pp.nums) 
literal = string_literal | numeric_literal 
properties = "properties" + "[" + literal + "]" 

PropertyLookup(), 지수() , and(), Equals() 및 GreaterThan()은 사용자 정의 cl입니다. 식 제작을 위해 만든 엉덩이.

제 4 줄 속성을 두 번째 줄과 동일한 방식으로 변경하려면 어떻게해야합니까? 나는 그런

class PropertyLookup(object): 
    def evaluate(self, props): 
     return props[self.key] 

어떤 도움에 감사드립니다이다 PropertyLookup()와 같은 사용자 정의 클래스에 문자를 전달하는 방법에 대한 대부분의 혼란 스러워요!

+0

무엇을 시도 했습니까? 그 결과는 무엇입니까? 예상과 다른 점은 무엇입니까? 튜토리얼에서 벗어나는 좋은 방법은 * 정확하게 * 복사 한 다음 수정을 시작하는 것입니다. 그것이 깨진다면, 그것이 여전히 작동하는 곳으로 돌아가서, 당신이 그것을 깨뜨렸던 것을 발견하십시오. –

답변

3

pyparsing을 사용하여 클래스를 구성하려면 구문에 구문 분석 조치로 첨부하십시오. 다음은이 수행하는 방법의 작은 예입니다 :

import pyparsing as pp 

class Node(object): 
    def __init__(self, tokens): 
     self._tokens = tokens 
    def __repr__(self): 
     return "{}: ({})".format(self.__class__.__name__, self._tokens.asList()) 

class AlphaNode(Node): pass 
class NumericNode(Node): pass 
class BinExprNode(Node): pass 
class OperatorNode(Node): pass 

alpha_expr = pp.Word(pp.alphas) 
numeric_expr = pp.Word(pp.nums) 
operand = alpha_expr | numeric_expr 
operator = pp.oneOf("+ - * /") 
bin_expr = operand + pp.OneOrMore(operator + operand) 

# by setting the node classes as each expression's parse action, 
# the node instances will be constructed at parse time and returned 
# as pyparsing's parse results 
alpha_expr.addParseAction(AlphaNode) 
numeric_expr.addParseAction(NumericNode) 
operator.addParseAction(OperatorNode) 
bin_expr.addParseAction(BinExprNode) 

result = bin_expr.parseString("a + 27 * X") 
print(repr(result[0])) 

인쇄는

BinExprNode: ([AlphaNode: (['a']), OperatorNode: (['+']), NumericNode: (['27']), OperatorNode: (['*']), AlphaNode: (['X'])]) 

또한 문법에 일부 왼쪽 재귀를 정리해야합니다 - 당신은 expr을 구현 할 수 없습니다 expr으로 시작하는이 값은 재귀 한계에 도달 할 때까지 반복됩니다. 로 기본 연산 식을 정의하여 시작

expr: literal     
    | "properties" ("[" expr "]")... 
; 

사용 대한 파싱의 OneOrMore 클래스 "속성"으로 색인의 반복을 위해. 그런 다음 SimpleBool.py 또는 evalArith.py와 같은 pyparsing 예제의 메서드를 사용하여 중침 표기식 및 평가기를 작성합니다.