BNF 문법에서 상태 기계를 도출합니다
-
18-09-2019 - |
문제
XSS-SAFE 문자열 보간 체계의 개념 증명을 구성하려고합니다.
대체물이있는 문자열이 주어지면
"Hello <b>$planetoid</b>!"
나는 그것을 문자 그대로의 부분과 대체물로 나누고 싶다 ("Hello<b>" planetoid "</b>!")
그런 다음 문자 그대로의 주 머신을 왼쪽에서 오른쪽으로 실행하십시오. 보간 된 값에 도달하면 (planetoid
위에서)), 나는 주에서 적절한 탈출 기능으로 이동할 수 있어야합니다.
LEX/YACC/Bison을 사용하여 상태 머신을 도출하고 문법의 라벨을 출력 상태와 연결할 수있는 방법에 대한 예를 아는 사람이 있습니까? JavaScript에서 모두 사용할 수있는 상태 머신을 도출하고 PHP의 기본 문자열 구현을 시도하고 교체하려고합니다.
이 작업을 수행하는 이유가 설명되어 있습니다 여기.
건배, 마이크
해결책
일반적으로 BNF로 표현할 수있는 문법의 상태 기계를 만들 수는 없습니다. 상태 기계는 일반 언어 만 인식 할 수 있으며 BNF는 컨텍스트없는 언어를 지정할 수 있습니다. YACC는 파서를 만들 수 있습니다. 충분할까요?
다른 팁
문법에 마커를 넣을 수있는 것처럼 보이므로 두 가지 다른 생산 유형을 사용하면 부작용이없고 캐릭터를 소비하는 문자를 소비하고 문자가 소비되지 않지만 상태 변수를 업데이트합니다.
ST_EXPECT_TAG_NAME : { state = TAG_NAME };
TAG_BODY
: '<' ST_EXPECT_TAG_NAME TAG_NAME ATTRS SPACES '>' ST_OUT_OF_TAG
;
컴파일 된 출력은 스위치 문의 상태 이름을 연관시킵니다.
YY_REDUCE_PRINT (yyn);
switch (yyn)
{
case 118:
#line 74 "tmp/html-combo.y"
{ state = TAG_NAME ;}
break;
C를 구문 분석하지 않고 테이블을 추출하는 방법이있을 수 있지만 YACC/Bison은 너무 무지합니다.
이를 위해 YACC/Bison을 사용할 수 있습니다. 처음에는 Bison을 살펴보면 상태 기계를 구현할 수있는 곳을 알기가 어렵습니다. 들소의 규칙은 왼쪽 오른쪽으로 해결됩니다. 즉; Rule1 Rule2 Rule3을 도출하는 규칙 (Rule0이라고 함)이있는 경우, 조치는이 순서로 호출됩니다 : Rule1, Rule2, Rule3, Rule0. 글로벌 상태 머신을 사용하여 규칙에 대한 동적 반환 값과 결합 할 수 있습니다 (문자열, int 또는 반환 값에 대한 컨테이너와 같은 다른 유형을 가진 Union을 사용합니다).