Alguém já usou as “preferências de seleção” fornecidas pelo MKS YACC?

StackOverflow https://stackoverflow.com/questions/478891

  •  20-08-2019
  •  | 
  •  

Pergunta

Desde que eu não recebi nenhuma resposta à minha pergunta Existe uma alternativa ao MKS YACC que suporta sintaxe de preferência de seleção ou algo muito semelhante?, Vou fazer a pergunta mais básica:

  • Alguém usou as "preferências de seleção" fornecidas pelo MKS YACC?

Se você tem, para que você usou? Além disso, faz algum sentido usá -lo em algo que não seja a última posição em uma regra?

Eu tenho que cuidar de uma gramática que figuras regras como:

    TOKEN1 LPAREN non_terminal1 [^EQUAL] TOKEN2 non_terminal2 RPAREN

A menos que eu esteja entendendo mal algo, a preferência de seleção incorporada não fornece nenhum valor nesse contexto.

Fundo

MKS YACC suporta uma notação que seu site chama "Sintaxe de preferência de seleção". Não é ilustrado, mas consiste em um token ou lista de fichas entre colchetes com um alvo (que pode ser opcional) e indica que o token em particular não deve seguir esse construto, mas que o token não é contado Como parte desta regra:

non_terminal1:  TOKEN1 non_terminal2 TOKEN2 [^TOKEN3]

Então, isso regras diz que um TOKEN1 seguido por a non_terminal2 e a TOKEN2 é um non_terminal1, a menos que o próximo token seja um TOKEN3 nesse caso, alguma outra regra se aplica.

(Não estou claro se o item entre colchetes pode ser um não terminal. O código que eu vi usando a notação sempre usa um token ou um par de tokens separados por espaço, e nunca um não terminal. Também não sou claro se o cuidador é necessário; novamente, todos os exemplos que eu vi usam o caret.)

Foi útil?

Solução

Jonathan. Às 1:30 da manhã, não estou preparado para tentar fazer isso sozinho, mas o que quer que essas regras façam, elas só podem ser abreviadas para obter regras que poderiam ser escritas em algo como o BNF normal. Olhando para isso, parece que o que a "preferência de seleção" está fazendo é permitir que você expresse o que, de outra forma, seriam várias produções com uma regra gramatical.

Eu fiz um pouco de escavação e encontrei isto, o que confirma minha suposição: o que a preferência de seleção faz é permitir que você insira explicitamente um lookahead, para que as regras que, de outra forma, estariam em Conflect possam ser desambigadas.

O que eu sugiro é pensar sobre como seria uma dessas regras se reescrito no YACC ou no BNF direto. Eu suspeito que isso vai dar algo como

TOKEN1 LPAREN non_terminal1 MULT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 DIVIDE TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 ADD TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 SUBTRACT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 EXP TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 MOD TOKEN2 non_terminal2 RPAREN
...

Para que o efeito geral seja tomar uma regra para cada operadora exceto igual, o [^ Notação é comum nas várias línguas Bell Labs para algo como o complemento de um conjunto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top