2016-10-05 2 views
0

몇 년 후에 렉서와 파서로 돌아와서, 나는 상황의 변화를위한 국가 변화의 개념에 혼란 스러웠다. 저는 파서로 레몬을 사용하고 제 자신의 렉서를 사용하고 있습니다. 파서가 미리 토큰을 미리 읽는다 고 가정해야합니까?

는의는 이와 같은 예 입력을 보자 :

그래서
[groups] 
syscon: 
    0x000 sysmemremap 
    0x004 presetctrl 

[registers] 
sysmemremap: 
    map  1-0 
    rsvd 31-2 
presetctrl:32 
    mux  2-0 
..etc... 

"SYSCON을"및 "sysmemremap :"같은 보이지만 하나는 GROUPNAME이고, 다른 하나는 REGISTERNAME이다. 각 토큰이 실제로 무엇인지 결정하는 [그룹]과 [레지스터] 사이의 컨텍스트 변경이 있습니다.

어째서 문맥상의 변화를 일으키는 가장 좋은 위치에있는 파서입니까? 구문 분석기에는 문법이 없기 때문에 한 세트의 상황에서 한 문법 세트가 적용되고 다른 세트에서 다른 문법 세트가 적용되는 경우 필자는 렉서가 모드가 "syscon :"인 경우 GROUPNAME을 생성하는 것으로 결정해야합니다 그렇게해야합니다.

편집 : 문제 요약 위키 백과에서 그냥 발견 "렉서 해킹"항목 : 모든 식별자가 동일한 형식을 가지고 있기 때문에 추가 컨텍스트없이

는, 렉서 다른 식별자에서 타입 식별자 을 구별 할 수 없습니다. .... 솔루션은 일반적으로 의미 기호 테이블 의 정보를 렉서로 다시 공급하는 것으로 구성됩니다. 즉, 이 렉서에서 파서까지 순수한 단방향 파이프 라인으로 작동하기보다는 의미 론적 분석에서 렉서로 되돌아가는 백 채널이 있습니다.

파서가 사전 토큰을 읽는 것에 대해 어떻게 생각합니까? 파서가 앞으로 부딪 히고 더 나은 일치를하기 위해 더 많은 토큰을 읽는다면 - 나는 적어도 어느 정도는 그렇게 할 것으로 기대한다. 파서의 상태 변화가 렉서에게는 너무 늦었다. 이미 그 토큰을 만났습니다!

아니면이 머리를 쓰지 않습니까?

답변

0

나는 내 자신의 질문에 대답 할 수 있습니다. 파서가 내부적으로하는 일에 의존하는 것은 나쁜 계획 일 가능성이 높습니다.

Lex와 Yacc 책 (O'Reilly 책)을 발견 했으므로 Lex 섹션의 예제 중 하나는 상태 변경입니다. "verb"라는 단어가 보이면 동사를 다음과 같이 정의하기 시작합니다. 그들을 찾는 것에 반대했다. 그 작업은 렉서에서 이루어 지므로 그렇게하는 것이 렉서 (lexer)에서하는 것처럼 보입니다.