Pergunta

Eu quero construir um lexer em C e eu estou seguindo o dragão livro, pode entender as transições de estado, mas como implementá-los?

Existe um livro melhor?

O fato de que eu tenho que analisar uma seqüência através de um número de estados para que eu possa dizer se a string é aceitável ou não!

Foi útil?

Solução

G'day,

Assumindo que você quer dizer O livro Dragão no projeto de compiladores, eu recomendo ter um olhar ao redor desta página em ferramentas de compilação.

A página em si é bastante pequeno, mas tem ligações através de vários recursos excelentes em analisadores lexicais.

HTH

aplausos,

Outras dicas

Você pode implementar transições de estado simples com uma única variável de estado, por exemplo, se você deseja percorrer os estados iniciar-> part1-> part2-> end, então você pode usar uma enumeração para acompanhar o estado atual e uso uma instrução switch para o código que você deseja executar em cada estado.

enum state { start=1, part1, part2, end} mystate;

// ...
mystate = start;
do {
  switch (mystate) {
    case start:
      // ...
    case part1:
      // ...
    case part2:
      // ...
      if (part2_end_condition) mystate = end; // state++ will also work
      // Note you could also set the state back to part1 on some condition here
      // which creates a loop
      break;
  }
} while (mystate != end);

Para obter mais complexas transições de estado que dependem de diversas variáveis, você deve usar tabelas / matrizes como este:

var1    var2    var_end    next_state
0       0       0          state1
0       1       0          state2
1       0       0          state3
1       1       0          state4
-1      -1      1          state_end // -1 represents "doesn't matter" here

Há mais de uma maneira de fazê-lo. Cada expressão regular corresponde diretamente a um programa simples estruturado. Por exemplo, uma expressão para números poderiam ser esta:

// regular expression
digit* [.digit*]

eo código C correspondente seria:

// corresponding code
while(DIGIT(*pc)) pc++;
if (*pc=='.'){
    pc++;
    while(DIGIT(*pc)) pc++;
}

A maneira transição da tabela de construir lexers é, na minha opinião, desnecessariamente complicado e, obviamente, corre mais lento.

Se você está à procura de um tratamento mais moderno do que o livro dragão (s): Andrew W. Appel e Maia Ginsburg, modernos Compiler Implementação em C , Cambridge University Press, 2008.

Capítulo 2 é focado na análise léxica: símbolos lexicais, expressões regulares, autômatos finitos; Nondeterministic Finite Automata; geradores de analisador léxico

Olhe para o Índice

O cabo flexível de programa (um clone do lex) irá criar um lexer para você.

Dado um arquivo de entrada com as regras lexer, que irá produzir um arquivo C com uma implementação de um lexer para essas regras.

Você pode verificar, portanto, a saída do cabo flexível para como escrever um lexer em C. Ou seja, não se você só quer usar Flex lexer ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top