Quelqu'un a-t-il utilisé les «préférences de sélection» fournies par MKS YACC?

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

  •  20-08-2019
  •  | 
  •  

Question

Depuis que je n'ai reçu aucune réponse à ma question Existe-t-il une alternative à MKS YACC qui prend en charge la syntaxe des préférences de sélection ou quelque chose de très similaire?, Je vais poser la question la plus fondamentale:

  • Quelqu'un a-t-il utilisé les «préférences de sélection» fournies par MKS YACC?

Si vous avez, pourquoi l'avez-vous utilisé? De plus, est-il logique de l'utiliser dans autre chose que la dernière position dans une règle?

Je dois m'occuper d'une grammaire qui figure des règles telles que:

    TOKEN1 LPAREN non_terminal1 [^EQUAL] TOKEN2 non_terminal2 RPAREN

À moins que je ne comprenne quelque chose, la préférence de sélection intégrée ne fournit aucune valeur dans ce contexte.

Arrière plan

MKS YACC prend en charge une notation que leur site Web appelle "Syntaxe de préférence de sélection". Il n'est pas illustré, mais il se compose d'un jeton ou d'une liste de jetons entre crochets avec un caret (qui pourrait être facultatif), et cela indique que le jeton particulier ne doit pas suivre cette construction, mais que le jeton n'est pas compté Dans le cadre de cette règle:

non_terminal1:  TOKEN1 non_terminal2 TOKEN2 [^TOKEN3]

Donc, cette règle dit qu'un TOKEN1 suivi par un non_terminal2 et un TOKEN2 est un non_terminal1, à moins que le jetons suivant ne soit un TOKEN3 Dans ce cas, une autre règle s'applique.

(Je ne suis pas clair si l'élément crocheté peut être un non terminal. Le code que j'ai vu en utilisant la notation utilise toujours un jeton ou quelques jetons séparés d'espace, et jamais un non-terminal. Je ne suis pas non plus Clair si le caret est nécessaire; encore une fois, tous les exemples que j'ai vus utiliser le caret.)

Était-ce utile?

La solution

Jonathan. À 1h30, je ne suis pas prêt à essayer de le faire moi-même, mais quoi que ce soit, ils ne peuvent être que des règles qui pourraient être écrites dans quelque chose comme le BNF normal. En regardant cela, il semble que ce que fait la «préférence de sélection» vous permet d'exprimer ce qui serait autrement plusieurs productions avec une règle de grammaire.

J'ai fait un peu de fouille et trouvé cette, ce qui confirme ma supposition: ce que fait la préférence de sélection, c'est vous permet d'insérer explicitement un lookahead, de sorte que les règles qui autrement seraient en conflit peuvent être désambigées.

Ce que je suggérerais, c'est de penser à ce à quoi ressemblerait l'une de ces règles s'ils étaient réécrits en yacc ou en BNF hétéro. Je soupçonne que ça va se révéler quelque chose comme

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
...

Afin que l'effet global soit de prendre une règle pour chaque opérateur à l'exception égal, le [^ La notation étant commune dans les différentes langues Bell Labs pour quelque chose comme le complément d'un ensemble.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top