들소 빌드 경고 :“-S 옵션이 주어 지지만 기본 규칙이 일치 할 수 있습니다”
문제
나는 경고를 받는다
warning, -s option given but default rule can be matched
Google "옵션이 제공되지만 기본 규칙이 일치 할 수 있다면" 진단에 관한 Flex 매뉴얼의 장 그리고이 항목에서 오래된 플렉스 맨 페이지 진단 섹션에서 :
경고, '-s 옵션이 주어진 옵션이지만 기본 규칙이 일치 할 수 있다는 것은 (아마도 특정 시작 조건에서만) 기본 규칙 (단일 문자 일치)이 특정 입력과 일치하는 유일한 것임을 의미합니다. 부터
-s
아마도 이것은 의도되지 않았을 것입니다.
내 빌드 파일에는 a가 없습니다 -s
옵션. 나는 썼다
bison -y -d calc1.y
flex calc1.l
gcc code...
이 경고를 어떻게 해결합니까?
다음은 내 Lex 파일의 작은 버전입니다. 이 파일은 또한 경고를 트리거합니다
%{
#include "y.tab.h"
%}
%option noyywrap nodefault yylineno
%%
[0-9]+ {
return INTEGER;
}
[-+()=/*{},;\n] { return *yytext; }
[ \t] /* skip whitespace */
[a-zA-Z0-9_]* { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }
%%
해결책
%옵션 nodefault는 -s와 같습니다
다른 팁
시스템의 "Flex"명령은 -S 옵션이있는 Flex 명령으로 별명을 받았을 수 있습니다. 이는 여러 스타트 업 스크립트에서 발생할 수 있습니다.
경고는 입력 파일의 규칙과 일치하지 않는 일부 입력이 있음을 알려줍니다. 경고는 정규 표현식의 모든 사례를 고려해야하는지 확인해야합니다.
기본 규칙을 진정으로 사용하려면 입력 파일의 규칙 끝에 추가하십시오. 규칙을 추가하십시오
. ECHO;
\n ECHO;
업데이트 : 제공하는 입력 파일에는 명령 줄에 "-s"를 지정하는 것과 동일한 %옵션 NodeFault가 포함되어 있으므로 미스터리가 해결됩니다. 또한 파일에는 "에 대한 규칙이 없습니다.". 예를 들어 '@'를 다루지 않은 문자가 있습니다.
나는 또한 캐릭터 클래스의 "-"기호를 의심합니다. 범위 운영자가되어야하지만 첫 번째 위치에서 캐릭터로 작동 할 수 있습니다. 모르겠어요. 대신 "-"를 사용하는 것이 좋습니다.
마지막 규칙을 변경할 수 있습니다
. { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }
경고를 제거하고 결과 스캐너가 충돌하지 않도록합니다).
또한 Bison 대신 Flex에 관한 질문 제목을 변경할 수 있습니까?