제목에서 말했듯이, 어휘 분석기는 어떤 데이터 타입을 파서에 반환 / 주어야합니까? Wikipedia 의 어휘 분석 기사를 읽을 때 다음과 같이 진술했습니다.
컴퓨터 과학에서 어휘 분석은 일련의 문자 (예 : 컴퓨터 프로그램 또는 웹 페이지)를 일련의 토큰 ( 식별 된 "의미"가있는 문자열 )으로 변환하는 프로세스입니다 .
그러나 위의 진술과 완전히 모순되어 다른 사이트에서 질문 한 다른 질문 ( 호기심이 많은 경우 코드 검토 )에 답변했을 때 응답하는 사람은 다음과 같이 말했습니다.
어휘 분석기는 보통 문자열을 읽고 이것을 lexemes의 스트림으로 변환합니다. 벡스는 숫자 스트림 일 필요가 있습니다 .
그리고 그는이 시각을주었습니다 :
nl_output => 256
output => 257
<string> => 258
이 기사에서 그는 Flex
이미 존재하는 어휘 분석기를 언급 했으며, '규칙'을 작성하는 것은 손으로 어휘 분석기를 작성하는 것보다 간단 할 것이라고 말했다. 그는 나에게이 예를 제시했다.
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
통찰력을 높이고 자세한 정보를 얻으려면 Flex 에 대한 Wikipedia 기사를 읽으십시오 . Flex 기사에서는 다음과 같은 방식으로 토큰을 사용하여 일련의 구문 규칙을 정의 할 수 있음을 보여주었습니다.
digit [0-9]
letter [a-zA-Z]
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"." { return PERIOD; }
":=" { return BECOMES; }
"=" { return EQL; }
"<>" { return NEQ; }
"<" { return LSS; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"begin" { return BEGINSYM; }
"call" { return CALLSYM; }
"const" { return CONSTSYM; }
"do" { return DOSYM; }
"end" { return ENDSYM; }
"if" { return IFSYM; }
"odd" { return ODDSYM; }
"procedure" { return PROCSYM; }
"then" { return THENSYM; }
"var" { return VARSYM; }
"while" { return WHILESYM; }
Flex lexer가 키워드 / 토큰 문자열을 반환하는 것 같습니다. 그러나 특정 숫자와 동일한 상수를 반환 할 수 있습니다.
렉서가 숫자를 반환한다면 어떻게 문자열 리터럴을 읽을 수 있습니까? 단일 키워드의 경우 숫자를 반환하는 것이 좋습니다. 그러나 문자열을 어떻게 처리 하시겠습니까? 어휘 분석기는 문자열을 이진수로 변환 할 필요가없고 파서는 숫자를 다시 문자열로 변환 할 것이다. 렉서가 문자열을 반환하는 것이 훨씬 논리적이고 쉬운 것처럼 보이며 파서가 숫자 문자열 리터럴을 실제 숫자로 변환하게합니다.
아니면 렉서가 두 가지를 모두 반환 할 수 있습니까? 나는 C ++로 간단한 렉서를 작성하려고 노력했지만 함수에 대해 하나의 반환 유형 만 가질 수 있습니다 . 따라서 저에게 질문을하도록 이끌었습니다.
내 질문을 단락으로 요약하려면 : 어휘 분석기를 작성할 때 하나의 데이터 유형 (문자열 또는 숫자) 만 반환 할 수 있다고 가정 하면 더 논리적 인 선택입니까?