2012-09-08 2 views
6

이것은 실제적인 것보다 "원칙적으로"더 많은 질문입니다. Yacc이 프로덕션을 줄이는 순서이며 정의 된 렉서 (lexer)에서 새 토큰을 읽습니다. I는이 토큰 세트 다음 한 경우 즉, :축소 순서는 Yacc에 정의되어 있습니까?

INTEGER_BEGIN 
INTEGER_VALUE 
LESS_THAN 
INTEGER_BEGIN 
INTEGER_VALUE 

이 같은 작품의 세트가 지정되면, 하나의 일에 INTEGER BEGIN INTEGER_VALUE을 감소하기 전에 Yacc에, 그것의 의미 내에서, 렉서에서 LESS_THAN 토큰을 읽을 수 :

expr : expr LESS_THAN expr 
    | integer 

integer : INTEGER_BEGIN INTEGER_VALUE 

의미 론적 동작으로 정의 된 경우 변경 사항을 적용 하시겠습니까?

답변

4

예. 가능합니다. Yacc은 LALR (1) 파서를 만듭니다. (1)은 lookahead의 1 토큰을 의미합니다. 따라서 규칙을 줄이기 전에 규칙의 토큰 끝을지나 1 토큰을 읽을 수 있습니다. 의미 론적 행동의 존재는 의미 론적 행동이 규칙을 줄이기 직전에 실행되는 C 코드 일뿐이므로 무의미합니다.

항상 토큰을 미리 읽을 수 있다고 보장 할 수는 없습니다. yacc 또는 bison에 의해 생성 된 파서는 'default reductions'을 사용합니다 - 다음 토큰을 먼저 읽지 않고 규칙을 줄일 수있는 상태. 이것은 규칙의 감소가 다음 토큰과 독립적 일 때마다 발생합니다.

이 구체적인 예에서는 integer 규칙에 기본 감소를 사용할 수 있으므로 미리보기없이 줄일 수 있지만 다시 보장 할 수는 없습니다. 일부 감소 (일부는 아니지만) 구현에서 사용되는 최적화가 기본 감소입니다. yacc.

+0

이런 일이 발생했는지 알 수있는 방법이 있습니까? –

+0

http://www.gnu.org/software/bison/manual/html_node/Default-Reductions.html에는 기본 감소의 의미에 대한 자세한 설명이 나와 있으며, 언급 한대로 렉서의 지연된 호출이 발생합니다. –

+0

일부 버전의 bison에서는 동작에서'if (yychar == YYEMPTY)'를 검사하여 기본 감소 상태인지 확인할 수 있습니다 (미리보기가 읽혀지지 않았 음). –

관련 문제