Estou procurando uma definição clara do que são um "tokenizer", "analisador" e "lexer" e como eles estão relacionados entre si (por exemplo, um analisador usa um tokenizador ou vice-versa)? Eu preciso criar um programa passará por arquivos de origem c / h para extrair declarações e definições de dados.
Eu tenho procurado exemplos e posso encontrar algumas informações, mas realmente estou lutando para entender os conceitos subjacentes, como regras gramaticais, analisar árvores e analisar a árvore abstrata de sintaxe e como elas se inter-relacionam. Eventualmente, esses conceitos precisam ser armazenados em um programa real, mas 1) como eles se parecem, 2) existem implementações comuns.
Eu estive pesquisando a Wikipedia sobre esses tópicos e programas como Lex e Yacc, mas nunca tendo passado por uma classe de compilador (EE major), acho difícil entender completamente o que está acontecendo.