Se eu tenho uma gramática tipo 3, ela pode ser representada em um autômato de empilhamento (sem fazer nenhuma operação na pilha) para que eu possa representar expressões regulares usando linguagens livres de contexto. Mas eu posso saber se uma gramática do tipo 3 é , L L ( 1 ) , S L R ( 1 ) , etc., sem a construção de todas as tabelas de análise?L R ( 1 )L L ( 1 )SL R ( 1 )
Todos os idiomas regulares possuem gramáticas LL (1). Para obter essa gramática, pegue qualquer DFA para o idioma regular (talvez fazendo a construção do subconjunto no NFA obtido a partir da expressão regular) e converta-o em uma gramática regular recursiva à direita. Essa gramática é então LL (1), porque qualquer par de produções para o mesmo não-terminal começa com símbolos diferentes ou produz um ε e tem $ como um token à procura de lookah. Consequentemente, todos os idiomas regulares também são LR (1), pois qualquer gramática LL (1) é LR (1). Além disso, usando um resultado importante deste artigo , você pode mostrar que qualquer idioma LR (1) possui uma gramática SLR (1), o que significa que qualquer idioma comum possui uma gramática SLR (1).
No entanto, os idiomas regulares não são todos LR (0). Os idiomas LR (0) têm propriedades muito específicas - em particular, devem ser livres de prefixos. Portanto, o idioma regular {a, aa} não é LR (0), embora seja claramente regular (regex a | (aa)). No entanto, os idiomas LR (0) não estão adequadamente contidos nos idiomas regulares; esta gramática para {0 n 21 n | n ≥ 1} é LR (0), mas o idioma não é regular:
O fato de as gramáticas regulares corretas aceitarem exatamente o conjunto de idiomas regulares geralmente é feito em sala de aula (ou mesmo nos exercícios), então a resposta é muito mais imediata.
Raphael
2
A sintaxe da expressão regular (simples e antiga) (você disse "representação") é LR (0). Você não precisa de nenhum lookahead para analisar uma sequência que representa uma regex. Você pode facilmente decidir isso executando um gerador de analisador em uma gramática para regexes: -} Você também pode codificar facilmente um analisador de descida recursiva simples (LL (0)) para regexps; qualquer coisa que seja LL (0) é LR (0).
Não sei se a sintaxe dos chamados "regexps" mais complicados, como os do Perl, é assim; mas os regexps de Perl são estritamente mais poderosos que os regexps, portanto, não são regexps antigos simples.
Para determinar se uma gramática tem alguma propriedade, você deve executar algum tipo de predicado. Para determinar se é (S) LR (k), você deve executar um predicado que possa verificar essa propriedade. De fato, qualquer predicado desse tipo deve criar as tabelas de análise, devido à maneira como elas são definidas.
A questão não era sobre como os regexps do Perl funcionavam. Era sobre se os regexps (Perl?) Eram analisáveis por certas tecnologias. Acredito que os regexps do Perl usem um NFA para fazer a correspondência, juntamente com outras capturas de dados sensíveis ao contexto, mas não vejo a relevância para a pergunta.
3
-1 As expressões regulares não são LR (0). Os idiomas LR (0) devem estar livres de prefixos, mas a expressão regular a|(aa)descreve um idioma que não é livre de prefixos. Além disso, os idiomas LR (0) não podem lidar com gramáticas com produções de épsilon; portanto, o idioma normal {epsilon, a} não é LR (0). No entanto, os idiomas regulares são LL (1) porque você pode escrevê-los como gramáticas regulares e, portanto, todos são LR (1). Como qualquer idioma LR (1) possui uma gramática SLR (1), isso significa que todos os idiomas regulares são SLR (1).
templatetypedef
1
Em relação ao LL (0), é o contrário: os idiomas LL (0) são um subconjunto adequado de idiomas regulares. Observe que LL (0) significa que você não usa lookahead para decidir entre diferentes derivações - o que basicamente significa que não há decisões e o idioma consiste em uma única palavra. LR (0), por outro lado, é uma classe útil - novamente, você não usa lookahead para decidir (aqui para reduções), mas ainda existe alguma diversidade devido ao fato de que a mudança pode distinguir entre diferentes produções.
1
@ IraBaxter- A sintaxe das expressões regulares também não é LR (0) porque as expressões regulares não são livres de prefixos. Eles também não são LL (0), porque os idiomas LL (0) podem conter apenas uma única sequência (ou nenhuma sequência).
A sintaxe da expressão regular (simples e antiga) (você disse "representação") é LR (0). Você não precisa de nenhum lookahead para analisar uma sequência que representa uma regex. Você pode facilmente decidir isso executando um gerador de analisador em uma gramática para regexes: -} Você também pode codificar facilmente um analisador de descida recursiva simples (LL (0)) para regexps; qualquer coisa que seja LL (0) é LR (0).
Não sei se a sintaxe dos chamados "regexps" mais complicados, como os do Perl, é assim; mas os regexps de Perl são estritamente mais poderosos que os regexps, portanto, não são regexps antigos simples.
Para determinar se uma gramática tem alguma propriedade, você deve executar algum tipo de predicado. Para determinar se é (S) LR (k), você deve executar um predicado que possa verificar essa propriedade. De fato, qualquer predicado desse tipo deve criar as tabelas de análise, devido à maneira como elas são definidas.
fonte
a|(aa)
descreve um idioma que não é livre de prefixos. Além disso, os idiomas LR (0) não podem lidar com gramáticas com produções de épsilon; portanto, o idioma normal {epsilon, a} não é LR (0). No entanto, os idiomas regulares são LL (1) porque você pode escrevê-los como gramáticas regulares e, portanto, todos são LR (1). Como qualquer idioma LR (1) possui uma gramática SLR (1), isso significa que todos os idiomas regulares são SLR (1).