문제

다음 구조를 구문 분석 할 수 있습니다.

blah
{
    "string-1",
    "string-2",
    ...,
    "string-n"
}

플렉스를 사용하여 토큰 화를 사용하고 있으며 완벽하게 작동합니다. 구문 분석에 YACC (Bison)를 사용하고 있습니다.

이 구조를 허용하는 권장 방법은 무엇입니까? 지금 내 test.y 파일에서 : 나는 다음과 같습니다.

blah_command:
    BLAH OPEN_BRACE string_list CLOSE_BRACE
    {
        printf( "String list is %s\n", $3 );
    }

string_list: /* empty */
    |
    STRING
    {
        return $1;
    }
    |
    STRING COMMA string_list
    {
        strcat($1, ",");
        strcat($1, $3);
    }

나는 strcat ()가 정말로, 정말 나쁜 생각이라고 생각합니다. 나는 Lex/YACC (약 3 시간의 경험)에 관해서는 진짜 초보자입니다. 그래서 손목에 닿고 올바른 방향의 포인터가 좋을 것입니다.

편집 : 이것의 목표는 외부 응용 프로그램에 대한 테스트 하네스를 구축 할 수 있도록하는 것입니다. Lexing/Parsing은 사용자가 제공하는 테스트 스크립트를 해석하는 데 사용됩니다. 하나의 명령을 사용하면 사용자가 응용 프로그램에 메시지를 보낼 수있는 다음 멀티 라인 응답을 읽고 사용자가 스크립트에서 제공 한 문자열의 변수 길이 목록과 비교할 수 있습니다. 위에 게시 한 조각은 사용자가 가능한 응답을 정의하게 할 것이라고 생각하는 방식입니다.

예를 들어:

blah
{
    "COMMAND EXECUTED CORRECTLY"
}

또는

blah
{
    "QUERY COMPLETE IN .0034 SECONDS",
    "1 RECORD FOUND:",
    "FOO=12345",
    "--END OF LIST--"
}
도움이 되었습니까?

해결책

당신이하는 모든 일이 이것을 인쇄하는 것만이라면, strcat ()는 모든 문자열을 하나로 연결하기 위해 잘 작동합니다.

그러나 일반적으로 파서는 추상 구문 트리를 구축하게됩니다. 따라서 문자열을 출력하는 대신 다음과 같은 것이 있습니다.

Node* n = new_node(STRING_LIST_NODE); // STRING_LIST_NODE being an enum node type
n->value = $1
n->next = $3
$$ = n;

다른 팁

당신의 예에서, 당신은 단순히 입력을 출력하고 있으므로 strcat은 괜찮습니다.

일반적으로, 시도하는 것은 추상 구문 트리를 구축하는 것입니다. AST의 경우 노드 구조를 만들거나 내용을 배열에 매핑 할 수 있습니다.

프로그램의 목표에 대해 자세히 설명하면 더 자세한 답변을 제공 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top