Я пытаюсь распечатать дерево разбора из этой функции
function main() {
n = input_int();
for (i=0; i<=n-1; ++i) {
if (isPrime(i)) {
output_int(i);
}
}
return 0;
}
до сих пор я сделал часть с файлом lex.l
%{
#include <stdio.h>
#include "yacc.tab.h"%}
%%
[{}()] {printf(" \n brackets %s \n", yytext);return BRACKETS}
(\+|-|\*|=|<|==|<=|&|\|\||%|\+\+) {printf(" \n operator %s \n",
yytext);return OP}
[0-9]+ {printf(" \n number %s \n", yytext);return NUMBER};
; {printf(" \n SEMICOLON %s \n", yytext);return SEMICOLON}
(function|for|if|return|else|false|true){printf("keyword %s \n", yytext
);return KEYWORD}
(input_int|main|isPrime|output_int) {printf("function name %s \n", yytext
);return FUNCTION_NAME}
[ndi] {printf(" \n variable %s \n", yytext);return VARIABLE}
%%
int yywrap(){
return 1;
}
int main() {
yylex();
return 0;
}
где я получаю токены. Я не понимаю, как мне написать yacc.y и сохранить все токены, чтобы распечатать их. Пока я только сделал эту часть, где
%{
#include <stdio.h>
void yyerror(char *);
int yywrap(void);
int yylex(void);
int yyparse(void);
%}
%token FUNCTION_NAME BRACKETS VARIABLE SEMICOLON OP KEYWORD NUMBER
%start program
%%
program: function;
function:
FUNCTION_NAME BRACKETS BRACKETS
| FUNCTION_NAME BRACKETS VARIABLE BRACKETS{
printf(" %s","function name");}
;
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
функция является корнем. Как сохранить все дерево и распечатать его? Например, когда я запускаю a.exe и ввожу main (), который должен распечатать «function», программа просто выходит, кажется, она выходит после того, как находит первый токен.
Компиляция: lex lex2.l,
yacc -d yacc.y,
gcc lex.yy.c yacc.tab.h
Почему программа закрывается, когда находит первый токен? И не могли бы вы дать краткий пример, как распечатать дерево разбора? Я знаю, что это абстрактный вопрос, но мне нужны только некоторые примеры определения грамматики для кода и распечатки дерева разбора в консоли любым способом
Задача ещё не решена.
Других решений пока нет …