Método de compilação do princípio ao fim para eliminar ambigüidade e recursão à esquerda


Prefácio

A linguagem é para atender a certas regras de composição de uma coleção de frases, frases que atendem a certas regras de composição seqüência de palavras, palavra é para atender a certas cadeias de regras de composição . Essas regras de composição são as produções na gramática.
A análise de sintaxe é a parte central do compilador e sua tarefa é verificar se a sequência de palavras emitida pelo analisador léxico é uma frase do idioma de origem, ou seja, se está em conformidade com as regras gramaticais do idioma de origem. Quer seja de cima para baixo ou de baixo para cima, o analisador gramatical examina a sequência de palavras de entrada da esquerda para a direita, lê uma palavra por vez e constrói uma árvore de análise gramatical para a sequência de palavras de entrada.

1. Método de cima para baixo

A ideia básica da análise gramatical de cima para baixo :
começando do símbolo inicial da gramática, busque uma derivação mais à esquerda da string de símbolo de entrada fornecida. Ou seja, a partir da raiz S, construa uma árvore de sintaxe da string de símbolo de entrada fornecida.

Exemplo: com

G: S → x A y, A → ∗ ∗ ∣ ∗, string de entrada: x ∗ ∗ y G: S → xAy, A → ** | *, string de entrada: x ** y G Sx A y ,UMA, Insira a string : Xy
é analisado como:
S → x A y → x ∗ ∗ y S → xAy → x ** ySx A yx∗ A
árvore de sintaxe y é:Árvore de sintaxe


2. Problemas de cima para baixo

1. Ambiguidade

1.1 Definição de ambigüidade : para a gramática G, se houver uma sentença com duas ou mais árvores de análise em L (G), então G é considerado ambíguo. Também pode ser dito de maneira equivalente: se houver uma frase com duas ou mais derivações mais à esquerda (ou mais à direita) em L (G), então G é uma gramática ambígua.

1.2 Antecedentes do problema de ambigüidade : Supondo que w ∈ L (G) e há duas derivações à esquerda de w, ao realizar uma análise gramatical de cima para baixo de w, o programa de análise gramatical não será capaz de determinar qual de w é mais Derive à esquerda. Então, a gramática tem um problema de ambiguidade.

1.3 Exemplo de problema bilateral :
假 Gramática estabelecida G Nyoshita:
G: E → id ∣ c ∣ E + E ∣ E - E ∣ E ∗ E ∣ E / E ∣ E ∗ ∗ E ∣ (E) G: E → id | c | E + E | E - E | E * E | E / E | E ** E | (E)G:Ei d c E+E E - E EE E / E EE ( E )
De acordo com a gramática G, analise as seguintes sentenças:

id 1 + c ∗ id 2 id1 + c * id2 i d 1+ci d 2
irá produzir duas árvores de sintaxe diferentes:
árvore de sintaxe um:Insira a descrição da imagem do refrigerante aquiárvore de sintaxe dois:
Insira a descrição da imagem aqui

2. Soluções para problemas de ambiguidade

Solução 1: Gramática modificada, importar Nova gramática Gramática
geral transformada G G: E → id ∣ c ∣ E + E ∣ E - E ∣ E ∗ E ∣ E / E ∣ E ∗ ∗ E ∣ (E) G: E → id | c | E + E | E - E | E * E | E / E | E ** E | (E)G:Ei d c E+E E - E EE E / E EE ( E ) é
transformado em:

 G:    E → E+T | E-T| T
		T → T*F | T/F | F
		F → F↑P | P 
		P → c | id | (E)  

Solução 2: De acordo com a relação de prioridade, garantir o princípio da prioridade dos operadores de alta prioridade.

3. Problema de recursão à esquerda

3.1 Definição de recursão à esquerda : Se houver uma derivação A -> αAβ, então a gramática G é dita recursiva, e quando α = ε, é chamada de recursão à esquerda.
Suplemento: Se A -> αAβ requer pelo menos duas derivações, a gramática G é chamada de recursão indireta. Quando α = ε, é chamada de recursão indireta à esquerda; se houver uma fórmula de produção da forma A -> αAβ na gramática G, então A gramática G é chamada de recursão direta, quando α = ε é chamada de recursão direta à esquerda.

3.2 O pano de fundo do problema de recursão à esquerda : Quando o primeiro símbolo não terminal na parte direita da produção é o símbolo não terminal na parte esquerda da produção, o problema de recursão à esquerda surgirá.

3.3 Exemplos de problemas de recursão direta à esquerda :
Exemplo: problemas de derivação infinita causados ​​por recursão à esquerda:

  Ger:	E→E+T   
		E→T   
		T→F   
		T→T*F    
		F→(E)   
		F→id 

Considere criar uma derivação mais à esquerda para a string de entrada id + id * id:
quando a derivação mais à esquerda é estabelecida, quando a derivação atinge E ou T, a recursão à esquerda é gerada, o que leva à derivação infinita.

3.4 Exemplo de
recursão indireta à esquerda : um exemplo de recursão indireta à esquerda:

     S → Ac | c
     A → Bb | b
     B → Sa | a

4. A solução para o problema de recursão à esquerda

4.1 Solução recursiva esquerda direta :

Etapa 1: Eliminação direta da recursão à esquerda (converter para recursão à direita)
Etapa 2: Introduzir uma nova variável A ', substituir a produção recursiva esquerda A → Aα | β por A → βA' A '→ αA' ​​| ε
acima O exemplo é resolvido de acordo com a solução:

Insira a descrição da imagem aqui
4.2 Solução recursiva esquerda indireta :

A ideia básica de eliminar a recursão indireta à esquerda : 1. Numere as variáveis ​​gramaticais; 2. Em seguida, use o método bring-in para transformar a recursão indireta à esquerda em recursão direta à esquerda; 3. Em seguida, use o método acima para eliminar a recursão direta à esquerda.
degrau:

1.将G的所有语法变量排序(编号),假设排序后的语法变量记为A1,A2,…,An;
2for i←1 to n {
    
    
3for j←1 to i-1 {
    
    
4.        对每个形如Ai→Ajβ的产生式,其中,Aj→α1|α2||αk是
           所有当前Aj产生式,用产生式Ai→α1β|α2β||αkβ替换
5}
6.     消除Ai产生式中的所有直接左递归
7} 

Análise de pseudo-código: quando
i = 1, o corpo do loop das linhas 3-5 não é executado. Neste momento, a operação de eliminação de recursão à esquerda na linha 6 é executada para eliminar a recursão direta à esquerda de todas as variáveis ​​A1.
Neste momento, todos A1 têm A1 → Uma produção na forma de Abα deve ter b> 1.

Olhando para i = 2, o elemento mais à esquerda à direita de A2 é uma variável. A forma de produção pode ser A2 → A1α | A2β | A3γ | ... Sabe-se
que o elemento atual mais à esquerda à direita de A1 é uma variável. A forma de produção é A1 → A2α '| A3β' | ......
Após a operação de substituição na linha 4, todas as produções de A2 têm a forma A2 → Abα, eb> = 2 devem ser encontradas.
Após executar a eliminação da recursão direta à esquerda na linha 6, todas as produções na forma de A2 → Abα em A2 devem ter b> 2.

i = 3, o elemento mais à esquerda à direita de A3 é uma variável. A forma de produção pode ser A3 → A1α | A2β | A3γ | ... É
sabido que o elemento atual mais à esquerda à direita de A1 é uma variável. A forma de produção é A1 → A2α '| A3β' | ……,
o elemento mais à esquerda à direita do atual A2 é uma variável. A forma de produção é A2 → A3α '| A4β' | ……
Após a operação de substituição na quarta linha, todo A3 tem A3 Uma produção na forma de Abα deve ter b> = 3.
Após executar a recursão direta à esquerda de eliminação na linha 6, todas as produções na forma de A3Abα devem ter b> 3.

Por analogia, i = n, após a operação de substituição na linha 4, todas as produções de An têm a forma de An → Abα, e b> = n devem estar lá.
Após executar a eliminação da recursão direta à esquerda na linha 6, todas as produções de An com a forma de An → Abα devem ter b> n. Em outras palavras, a recursão à esquerda foi eliminada.

A explicação detalhada das etapas de eliminação para o exemplo de recursão indireta esquerda acima é:

     S → Ac | c
     A → Bb | b
     B → Sa | a

Ordenação das variáveis ​​de sintaxe: quando B, A, S
i = 1, B → Sa | a não tem recursão direta à esquerda; quando
i = 2, A → Bb | b, obtenha depois de substituir a variável B, A → Sab | ab | b;
i = 3, S → Ac | c, substitua a variável A para obter S → Sabc | abc | bc | c; em
seguida, execute a operação de eliminação de recursão direta à esquerda.

5. Problemas de retrocesso

5.1 Definição do problema de retrocesso : as produções gramaticais Uma parte direita de cada sintaxe referida Uma variável do tipo candidato . Se houver vários candidatos para A com um prefixo comum , o analisador de cima para baixo não será capaz de selecionar com precisão a produção usada para derivação de acordo com os símbolos de entrada atuais e pode apenas testar. Quando a tentativa não é bem-sucedida, você precisa voltar à etapa anterior da derivação para ver se há outros candidatos para A. Isso é retroceder.

5.2 Exemplos de problemas de retrocesso :
Existe a seguinte gramática G:

Ge:	E→T   
    	E→E+T   
		E→E-T   
 		T→F   
 		T→T*F   
		T→T/F  
		F→(E)   
		F→id 

Considere estabelecer a derivação mais à esquerda para a string de entrada id + id * id:
No processo de derivação, como a análise gramatical descendente é usada, considera-se que E adota E → ET, e se não for possível, ele precisa voltar até E → Produção E + T.

6. Soluções de problemas retrocedendo

6.1 A solução do problema de backtracking utiliza o método de extração do fator esquerdo para transformar a gramática de forma a reduzir a ocorrência de backtracking no processo de derivação. É claro que simplesmente extrair o fator esquerdo não pode evitar completamente o fenômeno do retrocesso.

Insira a descrição da imagem aqui


Resumindo

Os requisitos gramaticais para análise de cima para baixo são determinados da seguinte forma:

  1. Inequívoco
  2. Sem recursão à esquerda;
  3. O primeiro terminal deduzido por cada candidato de qualquer variável gramatical A deve ser diferente.
  4. Link: Princípios de Compilação-Definição e Classificação da Gramática .
  5. Link: Princípio de compilação - conversão entre gramática regular e expressão regular .

Acho que você gosta

Origin blog.csdn.net/weixin_43824348/article/details/111590542
Recomendado
Clasificación