Original Article: Package jay
Author: Axel T. Schreiner

Pacote jay

Esta é a página inicial do jay, um gerador de analisador LALR (1): Berkeley yacc © foi segmentado para C# e Java

Veja a:
          Descrição

Sumário de Classe
iniciantes classe falsa, gatilhos javadoc.
 

Pacote jay Descrição

Esta é a página inicial do jay, um gerador de analisador LALR(1): Berkeley yacc © foi segmentado para C# e Java.

Uso

jay lê uma especificação gramatical de um arquivo e gera um analisador LALR(1) para ele. Um analisador consiste em um conjunto de tabelas de análise e uma rotina de driver de um esqueleto que é lido a partir da entrada padrão. Existem esqueletos adequados para Java e C#. As tabelas e o driver são gravados na saída padrão.

  jay [-ctv] [-b file-prefix] esqueleto de gramática|<skeleton
  java -jar jay.jar [-ctv] [-b file-prefix] esqueleto de gramática|<skeleton

As opções a seguir estão disponíveis:

-b file-prefix muda o prefixo anterior aos nomes dos arquivos de saída secundários para a string indicada por file_prefix. O prefixo padrão é o caractere y.
-c organiza as diretrizes da #line C do pré-processador C a serem incorporadas na saída. Isso só é útil para C#.
-t organiza a depuração de informações a serem incorporadas na saída. A informação real é controlada pelo arquivos esqueleto; Como distribuído, depende de pacotes de tempo de execução adicionais. Para C #, isso faz parte do download da fonte, para Java, veja jay.yydebug.
-v faz com que uma descrição legível por humanos do analisador gerado seja gravada no arquivo file_prefix.saída.

Se uma das variáveis ​​de ambiente TMPDIR, TMP, ou TEMP estiver configurada, a string da variável de ambiente será usada como o nome do diretório onde os arquivos temporários são criados.

Formato de entrada

O formato de entrada e o algoritmo LALR (1) não foram alterados a partir de yacc. Deve consultar a extensa literatura sobre yacc para detalhes sobre escrita e depuração de gramáticas, recuperação de erros, estratégias para ações, etc.

As únicas diferenças são a pilha de valores, a incorporação do analisador gerado em uma classe e a interface para o scanner. Tudo isso pode ser alterado modificando os arquivos de esqueleto. O restante desta seção é baseado nos arquivos de esqueleto distribuídos com jay.

A diretiva %union foi removida. jay usa Object (ou System.Object em C#) para a pilha de valores. Conseqüentemente, o nome na notação de tag <nome> refere-se a uma classe ou interface.

Isso tem implicações para os moldes que jay Nem C # nem Java permitem atribuições a variáveis ​​casted. Portanto, a notação $$ refere-se a um Objetct sem elenco porque $$ normalmente é atribuído. Se $$ for usado para outros fins, geralmente terá que empregar um tipo explícito $<nome>$ que é transformado em um elenco para name.

Da mesma forma, a notação $n raramente é atribuída a. Portanto, jay irá gerar um elenco, a menos que a notação $<>n seja usada para evitar o lançamento.

jay não emite moldes para Object. Esses moldes geralmente são desnecessários e esta estratégia evita inúmeras mensagens de alerta, mas pode causar uma surpresa em uma situação de sobrecarga.

jay não tem noção de herança. Isso pode levar a mensagens de aviso injustificadas reclamando sobre atribuições questionáveis. Sentiu-se que essas mensagens geralmente são úteis, mesmo que algumas delas sejam errôneas.

Genérico

As tabelas e os arquivos de esqueleto do jay não usam tipos parametrizados. jay.yydebug é codificado sem tipos parametrizados; no entanto, as fontes contêm código com genéricos em linhas que neste momento são comentadas.

A notação <tag> pode conter colchetes aninhados e dentro deles os caracteres [ ] em branco ? , além dos habituais alfanuméricos e. . $ _. No entanto, as referências à pilha de valor $n são lançadas usando a tag aplicável e um elenco para um tipo parametrizado irá desencadear um aviso não verificado em Java.

A classe analisadora pode ser anotada com @SuppressWarnings("desmarcado"); no entanto, enquanto isso pode ser uma forma de vida para o Java 5, provavelmente não é sensato.

Arquivos de Esqueleto

O download binário ou fonte inclui dois arquivos de esqueleto para Java e um para C #. Um arquivo de esqueleto controla o formato das tabelas geradas e inclui o algoritmo de analisador real que interpreta as tabelas. Os algoritmos são os mesmos em todos os arquivos distribuídos, mas o skeleton.tables inicializa as várias tabelas lendo um arquivo de recursos no tempo de execução; Isso evita um limite que o sistema Java impõe no tamanho do segmento de código para uma classe.

Para criar o arquivo de recursos, gere o analisador usando skeleton.tables. Da fonte do analisador extrair exatamente as linhas que começam com //yy e remover exatamente esse prefixo. O arquivo resultante deve estar localizado no mesmo diretório que o arquivo de classe do analisador e deve usar o nome da classe do analisador e o sufixo .tables.

Não deve ser necessário alterar os arquivos do esqueleto, mas apenas no caso de serem amplamente comentados. Os arquivos são orientados por linha. Um caractere na primeira coluna determina o que acontece com uma linha: # marca um comentário e a linha é ignorada. . marca uma linha que é copiada sem o período inicial.

t marca uma linha que é relevante para o rastreamento. Normalmente é copiado com um líder //t; se a opção -t estiver configurada, a linha será copiada sem o t inicial.

Finalmente, uma linha com um espaço em branco principal contém um comando que resulta na saída de algumas informações da tabela e que pode usar o resto da linha como um parâmetro.

ações emite código das ações como corpo de uma chave.
Epílogo emite o texto após o segundo %%.
Local emite o texto dentro de %{ %} após o primeiro %%.
Prologo emite o texto em %{ %} antes do primeiro %%.
Tokens prefixo emita cada valor token como um identificador inicializado com o restante da linha como um prefixo.
comentário de versões emite um // comentário com o resto da linha.
PrefixoyyCheck
prefixo yyDefRed
prefixo yyDgoto
prefixo yyGindex
prefixo yyLen
prefixo yyLhs
prefixo yyRindex
prefixo yySindex
prefixo
yyTable
Emitem o corpo da tabela relevante com o restante da linha como um prefixo para cada linha de saída.
prefixo yyFinal emita o valor como um inicializador com o restante da linha como um prefixo.
prefixo yyNames emite a tabela como uma lista de palavras com o restante da linha como um prefixo para cada linha de saída.
yyNames-strings emite a tabela como uma lista de inicializadores de cordas.
prefixo yyRule emite a tabela como uma lista de linhas com o restante da linha como um prefixo para cada linha de saída.
yyRule-strings emite a tabela como uma lista de inicializadores de cordas.

Cada tabela é prefixada por um comentário com informações de dimensão.

Gerenciamento de Classe

O design de um arquivo de esqueleto deve considerar dois problemas: como incorporar o analisador em uma classe e como se conectar ao scanner.

Os arquivos de esqueleto distribuídos esperam que o usuário forneça um prolog em %{ %} contendo um cabeçalho de classe e para fornecer um epilog após o segundo %% que fecha essa classe. jay não conhece o nome da classe do analisador.

A interface para o scanner yyInput é gerada como um membro de cada classe de analisador; Isso pode ou não ser uma boa escolha. Existem três métodos: o adiantamento não possui argumentos e deve retornar um valor booleano, indicando que o scanner extraiu com sucesso outro símbolo de entrada; token não tem argumentos e deve retornar o símbolo de entrada atual como um valor inteiro que o analisador espera; O valor não tem argumentos e pode retornar um valor de objeto a ser colocado na pilha de estado / valor para o símbolo de entrada. O rastreamento espera que o token e valor sejam funções constantes entre cada chamada para avançar .

Os valores de token explícitos são gerados como constantes na classe de analisador. Os personagens individuais se representam; no entanto, para aqueles jay acredita no ASCII em vez do conjunto de caracteres Unicode. Talvez tenha sido melhor definir as constantes na interface do scanner, mas espera-se que o scanner seja implementado como uma classe interna do analisador. pj suporta essa visão mesmo se o scanner for construído usando o JLex.

Downloads

Versão:
1.1.1, Junho de 2006.
Autor:
Axel T. Schreiner.