2

Phat, Smalltalk에서 PetitParser를 사용하는 방법을 배우고 있으며 교과서를 사용하여 배우고 있습니다. 교과서에는 다음과 같은 스크립트가 제공됩니다. 난 놀이터에서 그것을 인쇄 할 때 교과서의 PetitParser arithmatic 스크립트가 작동하지 않습니다. 파세 온이 싫다고 계속 말했어?

term := PPDelegateParser new. 
prod := PPDelegateParser new. 
prim := PPDelegateParser new. 
term setParser: (prod , $+ asParser trim , term ==> [ :nodes | nodes first + nodes last ])/prod. 
prod setParser: (prim , $*asParser trim , prod ==> [ :nodes | nodes first*nodes last ])/prim. 
prim setParser: ($(asParser trim , term , $) asParser trim ==> [ :nodes | nodes second ])/number. 
start := term end. 
start parse:'1+2*3'. 

그러나, 나는 MessageNotUnderstood를 얻을 :의 수신기 "parseOn을"무기 호입니다. 내가 뭘 잘못 했니?

+1

'숫자'란 무엇입니까? 스 니펫에 정의 된 내용이 표시되지 않습니다. –

+0

네가 맞다. 고맙다. 이 질문을 볼 수만 있다면 동일한 코드를 사용했지만 나눗셈 및 곱셈 방법도 추가했습니다. http://stackoverflow.com/questions/42034072/petitparser-evaluator-not-working-properly –

답변

2

number의 정의를 추가하면 파서가 원하는 결과를 생성합니다. 다음 코드는이를 수행하고 그 외의 경우 (서식 지정 제외)

number := #digit asParser plus token trim 
    ==> [:token | token inputValue asNumber]. 
term := PPDelegateParser new. 
prod := PPDelegateParser new. 
prim := PPDelegateParser new. 
term 
    setParser: prod , $+ asParser trim , term 
     ==> [:nodes | nodes first + nodes last] 
     /prod. 
prod 
    setParser: prim , $* asParser trim , prod 
     ==> [:nodes | nodes first * nodes last] 
     /prim. 
prim 
    setParser: $(asParser trim , term , $) asParser trim 
     ==> [:nodes | nodes second] 
     /number. 
start := term end. 
^start parse: '1+2*3' 
관련 문제