Como os comentários são expressos nas gramáticas da linguagem de programação?

8

Estou aprendendo a criar analisadores usando gramáticas, mas fiquei preso tentando expressar comentários, porque eles podem aparecer em quase qualquer lugar.

Isso indica que os comentários podem ser removidos do fluxo de token antes da análise.

Essa é a prática padrão ou os comentários são sempre / frequentemente especificados em gramáticas?


fonte
"Eles podem aparecer quase em toda parte" é um pouco exagerado. Existem muitos idiomas que permitem apenas comentários entre as declarações.
MSalters
1
Como exemplo de um idioma que NÃO remove os comentários antes da análise, consulte TCL - os comentários fazem parte da gramática e, se você os colocar no lugar errado, pode esperar que o analisador grite com você.
22612 Michael Kohne
@ Michael Não consigo encontrar uma gramática para o TCL: essa página parece indicar que não há uma estática.
1
@MattFenwick - bom molho. Eu não sabia que era tão maleável. De acordo com o que diz, você não pode ter uma gramática TCL, não faz sentido. Eu não tinha idéia, desculpe pela pista falsa.
Michael Kohne

Respostas:

2

É muito comum tratá-lo como uma forma de espaço em branco. Muito da mesma maneira que as novas linhas em idiomas orientados a ponto e vírgula como C.

Uma vez que é alguma forma de espaço em branco, você freqüentemente a ignora mais alto no analisador.


fonte
17

Eles geralmente não são.

Eles são removidos pelo lexer, quando o código-fonte é transformado de caracteres em tokens.

Em seguida, o analisador receberá tokens e criará um AST. Quando o analisador faz seu trabalho, os comentários já desaparecem, para que eles não precisem aparecer na gramática.

deadalnix
fonte
5

Resposta rápida e curta

Sim, é a prática padrão, detectar comentários no "lexer" ou no "parser"

Às vezes, o "analisador" possui um "lexer" interno ou é misturado ao "analisador" como uma única ferramenta ("lexer-parser").

Resposta estendida

Eu apenas estou trabalhando nesse caso.

A maioria dos "scanners" (também conhecidos como "tokenizers" ou "lexers") detecta comentários, mas é removida ao retornar tokens para o "analisador".

Às vezes, uma linguagem de programação, usa alguns comentários com um significado especial, como "diretivas do compilador" ou "documentação".

Exemplo de comentário padrão:

/*
 This function does something cool.
*/
int doSomething()
{
  return 0;
}

Exemplo de comentário da diretiva:

/*
 ##override
*/
int doSomething()
{
  return 0;
}

Comentário para o gerador de documentação Exemplo:

/*
 @description: This Function text will be turn,
  into an external pdf file, togheter with other
  similar comments.
*/
int doSomething()
{
  return 0;
}

A maioria das ferramentas relacionadas ao compilador detecta esses comentários especiais, com um analisador ou pré-processador, que não é o lezxer ou analisador principal, e ainda possui um lexer pequeno.

Felicidades.

umlcat
fonte
0

Alguns analisadores que retêm comentários e / ou entradas ilegais no AST os adicionam como propriedades a todos os nós do AST.

Você pode dar uma olhada no projeto Microsoft Roslyn, que faz isso se bem me lembro.

Patrick
fonte