Regex deve ser usado em um analisador para um interpretador ou compilador?

ao analisar uma gramática, deve RegEx ser usado para corresponder gramáticas que podem ser expressas como linguagens regulares ou deve o atual desenho do analisador ser usado exclusivamente?

por exemplo, a gramática EBNF para JSON pode ser expressa como:

object ::= '{' '}' | '{' members '}';
members ::= pair | pair ',' members;
pair ::= string ':' value;
array ::= '[' ']' | '[' elements ']';
elements ::= value | value ',' elements;
value ::= string | number | object | array | 'true' | 'false' | 'null';

então a gramática teria de ser correspondida usando algum tipo de analisador léxico (como um analisador de descida recursivo ou um analisador ad hoc), mas a gramática para alguns dos valores (como o número) pode ser expressa como um analisador regular linguagem como este padrão RegEx para o número:

-?\d+(\.\d+)?([eE][+-]?\d+)?

dado este exemplo, assumindo que se está a criar uma descida recursiva JSON parser... o número deve ser correspondido através da técnica de descida recursiva ou o número deve ser correspondido via RegEx, uma vez que pode ser correspondido facilmente usando RegEx?

Author: David, 2017-06-15

1 answers

Esta é uma questão muito ampla e opinativa. Portanto, tanto quanto sei, normalmente você vai querer que um analisador seja o mais rápido possível e tenha a menor pegada possível na memória, especialmente se ele precisa analisar em tempo real (a pedido). Um RegEx certamente fará o trabalho, mas é como atirar numa mosca com uma arma nuclear !

É por isso que muitos parsers são escritos em linguagem de baixo nível como C para tirar vantagem dos ponteiros de cordas e evitar a sobrecarga causada por linguagens de alto nível como Java com campos imutáveis, coletor de lixo,..

Entretanto, isto depende muito do seu caso de uso e não pode ser verdadeiramente respondido de uma forma genérica. Você deve considerar o tradeoff entre a conveniência do desenvolvedor para usar o RegEx versus o desempenho do analisador.

Uma consideração aditionnal é que normalmente você vai querer que o analisador para indicar onde você tem um erro de sintaxe, e que tipo de erro é. Usando um RegEx, ele simplesmente não corresponder e você terá dificuldade em descobrir por que parou, a fim de exibir uma mensagem de erro adequada. Ao usar um analisador antigo, você pode parar de analisar rapidamente assim que você encontrar um erro de sintaxe e você pode saber exatamente o que não coincidiu e onde.

No seu caso específico para o JSON parsing e usando o RegEx apenas para números, suponho que você provavelmente já está usando uma linguagem de alto nível, então o que muitas implementações fazem é confiar no processamento nativo da linguagem para numero. Então escolha o valor (string, number,...) usando os delimitadores e deixar a linguagem de programação lançar uma exceção para o processamento de números.

 0
Author: Simon, 2017-06-14 23:44:18