Alguém já usou as “preferências de seleção” fornecidas pelo MKS YACC?
-
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.)
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.