문제
다음 구조를 구문 분석 할 수 있습니다.
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의 경우 노드 구조를 만들거나 내용을 배열에 매핑 할 수 있습니다.
프로그램의 목표에 대해 자세히 설명하면 더 자세한 답변을 제공 할 수 있습니다.