Criar uma função de impressão
Pergunta
Estou aprendendo Bison e neste momento a única coisa que eu era o rpcalc exemplo, mas agora eu quero implementar uma função de impressão (como printf
de C), mas eu don' t sabe como fazer isso e estou planejando para ter uma sintaxe como esta print ("Something here");
, mas eu não sei como construir a função de impressão e eu não sei como criar esse ;
como um fim da linha.
Obrigado por sua ajuda.
Solução
Você primeiro precisa perguntar a si mesmo:
Quais são os [sub] partes do meu 'print ( 'algo');' sintaxe?
Depois de identificar essas partes, "simplesmente" descrevê-los na forma de regras de sintaxe gramatical, juntamente com regras de produção aplicáveis. E depois deixá-Bison gerar o analisador para você; Isso é sobre ele.
Para colocá-lo em seu caminho :
A semi-coluna é provavelmente um elemento que irá utilizar para separar statemements (a uma "chamada" como imprimir a partir de outra).
'Print' em si é provavelmente uma palavra-chave , ou, de preferência um nome de função nativa do seu idioma.
O declaração de impressão parece ter um string literal como [um dos] os seus argumentos. uma string literal começa e termina com aspas duplas (e, provavelmente, permitir citações escaparam dentro de si)
etc.
O em negrito e itálico expressões acima são algumas das entidades (os 'símbolos' na linguagem do analisador) é provável que você precise definir na sintaxe para o seu idioma. Por que você vai usar regras de gramática Bison, como
stmt : print_stmt ';' | input_stmt ';'| some_other_stmt ';' ;
prnt_stmt : print '(' args ')'
{ printf( $3 ); }
;
args : arg ',' args;
...
Uma vez que a pergunta sobre o semi-coluna, talvez alguma confusão foi a partir dos diferentes usos dos mesmos; ver, por exemplo acima como o ';' pertencem a sintaxe do seu idioma em que o; (Sem aspas) no final de cada regra gramatical fazem parte da linguagem de Bison.
Nota: este é, naturalmente, uma implementação simplista, que visa mostrar o essencial. Também a sintaxe Bison pode ser um off tat (esteve lá / feito isso, mas um longo tempo atrás ;-) Eu, então, "conheci" ANTLR para nunca mais voltar a Bison, embora eu ver como a sua leveza e totalmente auto-contido natureza pode torná-lo apropriado em alguns casos)