정수 유형과 일치해야하지만 정수로만 분리해야합니다. 예 :한 문자열에서 일치하는 정수 Lex
INTEGER (-?[0-9]+)
NOTENDLINE [^$]
%%
{INTEGER}/{NOTENDLINE} {}
%%
"23test"와 같은 문자열을 입력하는 경우 잘못되었거나 정수가 일치하지 않아야합니다. 하지만 내 솔루션은 필요에 따라 작동하지 않습니다. 나도 몰라, 내가 필요로하는 것은 NOTENDLINE.
정수 유형과 일치해야하지만 정수로만 분리해야합니다. 예 :한 문자열에서 일치하는 정수 Lex
INTEGER (-?[0-9]+)
NOTENDLINE [^$]
%%
{INTEGER}/{NOTENDLINE} {}
%%
"23test"와 같은 문자열을 입력하는 경우 잘못되었거나 정수가 일치하지 않아야합니다. 하지만 내 솔루션은 필요에 따라 작동하지 않습니다. 나도 몰라, 내가 필요로하는 것은 NOTENDLINE.
당신이이 공백 다음 경우에만, 그래서 직접 할 수 있지만 정수를 일치 시키려면 :
-?[[:digit:]]+/[[:space:]]
il 정수가 개행 문자가없는 파일의 맨 끝에있는 경우 텍스트 파일은 개행 문자 이외의 문자로 끝나지 않습니다. 그러나 다음을 수행 할 수 있습니다.
-?[[:digit:]]+/[[:space:]] { /* Handle an integer */ }
-?[[:digit:]]+/. { /* Handle the error */ }
-?[[:digit:]]+ { /* Handle an integer; this one must be at EOF */ }
이 기능을 사용할 수 있습니까? 그것은 렉서가 가장 길게 매치 된 규칙을 찾을 것이라는 사실에 의존하지만, 두 개가 같은 경우 첫 번째 규칙이 사용됩니다.
%option noyywrap
DIGIT [0-9]
OTHER [a-z0-9]*
%%
{DIGIT}+ printf("Integer: %s (%d)\n", yytext, atoi(yytext));
{OTHER} printf("Other: %s\n", yytext);
[ \t\n]+ /* eat up whitespace */
%%
int main(int argc, char **argv)
{
++argv, --argc; /* skip over program name */
if (argc > 0)
yyin = fopen(argv[0], "r");
else
yyin = stdin;
yylex();
}
샘플 입력 (파일) :
test
test123
123
123test
샘플 출력 상 :
Other: test
Other: test123
Integer: 123 (123)
Other: 123test
부정 마진 문자 클래스 구문 ([^])을 사용하여 줄 끝 표시 ($)를 부정 할 수 없습니다. "정수로만 분리해야합니다."라고 쓰지만 규칙을 이해하지 못합니다. 정수 문자열을 따라갈 수있는 문자와 그렇지 못할 수있는 문자는 무엇입니까? –
문자열은 "test 123test"와 같을 수 있습니다. 많은 토큰이 있지만 별도의 정수를 파싱해야합니다. "테스트 123"결과 정수 123, 예를 들어 정수가없는 경우. 문자열은 모든 문자로 구성되지만 받아들이 기 위해서는 integer가 적어도 공백이나 끝 문자로 구분되어야합니다. – freakz