Eu estive observando alguns lexers em vários idiomas de nível superior ( Python , PHP , Javascript entre outros) e todos parecem usar expressões regulares de uma forma ou de outra. Embora eu tenha certeza de que as regexs são provavelmente a melhor maneira de fazer isso, eu queria saber se havia alguma maneira de obter lexing básico sem expressões regulares, talvez algum tipo de análise direta de strings ou algo assim.
Então, sim, é possível implementar algum tipo de lexing básico em uma linguagem de nível superior * sem usar expressões regulares de qualquer forma?
* Linguagens de nível superior, como Perl / PHP / Python / Javascript etc. Tenho certeza de que existe uma maneira de fazê-lo em C
theory
regular-expressions
lexer
mancha
fonte
fonte
Respostas:
Primeiro de tudo, existem bibliotecas de expressões regulares para C desde antes de suas linguagens de "nível superior" serem inventadas. Apenas dizendo, os programas em C não são tão idiotas quanto algumas pessoas parecem pensar.
Para a maioria das gramáticas, lexing é uma questão de procurar espaço em branco e alguns outros caracteres como () [] {}; para dividir as palavras e, em seguida, comparar com uma lista de palavras-chave para ver se há alguma correspondência.
fonte
Você pode estar interessado em "analisadores sem scanner", que não possuem uma etapa de tokenização separada. Uma explicação dos benefícios dos analisadores sem scanner é dada no início deste artigo: Filtros de desambiguação para analisadores LR generalizados sem scanner . (Existem também desvantagens.)
(Os PEGs, mencionados em outras respostas, também podem ser usados para criar analisadores sem scanner.)
fonte
Não há nada específico sobre expressões regulares. Eles são simplesmente abreviações, o que permite gerar o código muito mais facilmente, e as implementações são normalmente enviadas. No entanto, fundamentalmente, os lexers são FSMs e expressões regulares são apenas uma maneira de atingir esse objetivo.
fonte
Claro que você pode usar outros analisadores, pois todo idioma comum também é livre de contexto. A questão realmente se resume a por que você gostaria.
Não há realmente nada mais simples do que expressões regulares (como você pode melhorar O (N)?) E tentar simplificar não ajuda. Você sempre pode usar o retorno simples, como Jetti apontou, embora eu recomendo evitá-lo, se possível.
Se você usar um analisador mais avançado para lexing, provavelmente não precisará de uma fase de lexing. De fato, as razões pelas quais temos uma fase de lexing são que é mais rápido analisar tokens flexíveis do que analisar caracteres, além de simplificar drasticamente nossa etapa de análise. Portanto, ao usar um analisador mais avançado, você simplesmente perde todos os benefícios do lexing em primeiro lugar.
fonte
Faz sentido fazer uma análise lexical com expressões regulares ou ignorar essa passagem e fazer uma análise muito mais flexível e poderosa sem lexer com PEG ou GLR.
fonte