일부 명령을 구문 분석하는 문법을 만들고 싶습니다. 대부분은 완벽하게 작동하지만 "if (조건, then-value, else-value)"가 "out"명령과 함께 작동하지 않아 일부 값을 표시합니다. 그것은 잘 작동하는 경우에 출력 명령은 외부에있는 경우-명령을if commm에서 실행을 억제하는 PEG 문법
out(if(1,42,43))
출력 →
하고 확인을 예상대로 42을 반환
그러나 순간에 출력 명령은 해당 시점의 내부 및 다른입니다 OK 예상
if(1,out(42),out(43))
→은 여전히 42을 반환하지만, 출력 기능 (42, 43)
,691 회 호출 (보다 직관적 일 필요가있다)는 part의 실패Expression
= Int
/"if(" cond:Expression "," ok:Expression "," nok:Expression ")" { return cond?ok:nok; }
/"out(" num:Expression ")" { window.alert(num); return num;}
Int = [0-9]+ { return parseInt(text(), 10); }
은 "창 : 다음과 같은 매우 간단한 문법을 사용하는 경우 내가 페그/다리 파서 생성기 here 문제와 C에서 일하고 있어요
도 PEG.js 온라인 파서 생성기 here로 재현. alert() "는 필요한 출력 함수의 자리 표시 자일 뿐이므로이 문제는 동일하게 작동합니다. 스캐너가 전체 if 명령을 과 일치시키고, 닫는 괄호 ")"까지 else 값과 일치해야합니다. 따라서 두 명령 모두 일치하고 정의 된 함수를 실행합니다. 이는 예상 한 것과 다릅니다.
일부 문자와 일치 시키려면 peg/leg에 방법이 있지만 상황에 따라 해당 함수의 실행을 억제 할 수 있습니까?
(나는 이미 성공없이 "&"술어 요소로 실험 한) 는는 (아마도 오른쪽 재귀 대 여기에 도움이 될 수 재귀 왼쪽 만 사용 PEG/다리 발전기에는 오른쪽 지원 보인다 재귀)
와우,이 내 문법의 완전한 재 설계로 이어질 것이다 다음과 다른 장애인 재귀의 경우-명령의 중복 정의입니다. 지금은 20 개 이상의 함수가 패턴 뒤의 문법 내에 {}로 구현되어 있습니다. 대부분은 매우 간단합니다. 바이트 코드 트리를 생성하고 실행하면 실제로 유효한 해결책이 될 것입니다. 현재 다른 선택의 여지가 없습니다. Achim에게 감사드립니다. – Achim