필자는 파서/렉서를 재진입 구현으로 바꾸어 놓았으며 마지막 장애물은 중첩 된 include script.txt 유형의 명령어를 수행 할 수있는 기능입니다. 만에 세그먼트 폴트, 그렇지 않으면 토크 나이의 휴식과 파서가 잘 작동 : ^{include}{ws}+ { BEGIN INCL; }
<INCL>[^ \t\n\r\f]+ { /* Swallow e
나는 렉서를 만들고 있습니다. 이스케이프 문자가있는 문자열 리터럴에 문제가 있습니다. 이게 내 렉스 코드 야. string L?\"(\\.|[^\\"])*\"
{string} {
int len;len = strlen(yytext);
yylval.string = strdup(yytext + 1);
yylval.strin
Flex/Bison에서 생성 한 C 루틴을 호출하는 C++ 프로그램이 있습니다. 참고로 YY_BUFFER_STATE yy_create_buffer(FILE *file, int size)
{
YY_BUFFER_STATE b;
b = (YY_BUFFER_STATE) yy_flex_alloc(sizeof(struct yy_buffer_stat
여기에 내 lex 파일이 있습니다. %{
#include <stdio.h>
%}
%%
stop printf("Stop command received\n");
start printf("Start command received\n");
%%
flex을 사용하여 컴파일했습니다. 그러나 gcc을 사용하여 lex.yy.c을 컴파일하면 오류가 발생합니
파서를 생성하고 생성하는 데 사용하는 두 개의 파일이 있습니다. 파일 1 : drive.l %{
#include<stdio.h>
#include<string.h>
#include"y.tab.h"
/*
#define START 1
#define STOP 2
#define FWD 3
#define BACK 4
#define UP 5
#d
내 플렉스 파일은 아래에 있습니다. 사소한 기호 외에도 문자열을 읽는 상태 시스템을 정의합니다. 따라서 "이 발생할 때마다 시작되어 다음 "을 찾으면 종료됩니다. 그것은 올바르게 식별하지만 사과를 찾는데 실패 "this" "apple" : 지금은이 플렉스 파일이 같은 서로 다음 두 개의 문자열 입력을 공급하는 경우. 왜 현재의 행동이 일어나고 있습니까? B
나는 간단한 Basic-like 언어를 쓰고있다. 어떤 이유로 나는 'call my_subroutine'을 사용하여 서브 루틴을 호출하는 대신 'call'키워드를 피하고 싶습니다. E.g: a=8:do_something:b=c+d 나는 서브 루틴을 선언 할 수있는 잘 작동하는 방법을 가지고있다. Flex는 또한 선언 된 서브 루틴이 사용자 문자열에 나타날
일부 추가 문자 가져옵니다 L [a-zA-Z_]
A [a-zA-Z_0-9]
%%
{L}{A}* { yylval.id = yytext; return IDENTIFIER; }
을 그리고 난 내 YACC 파일에서 다음을 수행하십시오 primary_expression
: IDENTIFIER { puts("IDENTIF