2016-10-30 2 views
0

C'est une expression arithmétique pour ma langue: ADD 100 MUL 5 DIV 10 SUB 7 MOD 10 4Comment écrivez-vous une grammaire pour cette expression arithmétique?

ADD = addition, soustraction SUB =, MUL = multiplication, DIV = division, MOD = modulo.

L'expression ci-dessus peut également être réinsérée dans la norme 100 + (5 * (10/(7 - (10 % 4)))), parenthèse incluse pour marquer l'ordre des opérations.

Ceci est tout à fait différente de la norme, car l'évaluation commence par le droit le plus fonctionnement, c'est MOD 10 4, alors le résultat de qui est ensuite utilisé pour évaluer l'opération suivante, qui est SUB 7 2, où 2 est le résultat du modulo opération. La parenthèse n'est pas requise pour cette grammaire.

j'ai obtenu la grammaire pour maintenir la notation standard de https://ruslanspivak.com/lsbasi-part6/, voici:

<expr> := <term> ((ADD|SUB) <term>)* 
<term> := <factor> ((MUL|DIV|MOD) <factor>)* 
<factor> := integer 

Dans ma langue, je suis désemparés par écrit la grammaire pour les opérations arithmétiques. Des modifications sont-elles nécessaires pour la grammaire ci-dessus? Ou ai-je besoin d'écrire une grammaire complètement nouvelle?

+0

Écrire une grammaire, c'est comme écrire un programme. Vous proposez un fragment de code/grammaire, vous décidez s'il fait ce que vous attendez, et si ce n'est pas le cas, changez-le jusqu'à ce qu'il le fasse. Si vous comprenez les grammaires, cela ne devrait pas être difficile. Si vous ne le faites pas, l'expérience vous aidera à les comprendre. Qu'avez-vous essayé de faire pour écrire votre propre grammaire ou tester que celui-ci est OK? –

+0

J'ai écrit avec succès les méthodes et le code pour analyser une expression arithmétique standard (+, -, *, /,%) comme le faisait le guide, je viens de convertir le code Python en C#. J'ai également réussi à analyser une seule opération en utilisant ma langue en modifiant la grammaire dans le guide ': = (ADD | SUB) ', mais je suis bloqué à résoudre comment analyser une expression avec plusieurs opérations. –

Répondre

-1

J'ai réussi à résoudre ce problème en analysant l'exécution de chaque production dans mon code. À ma grande surprise, j'ai oublié d'inclure une production <expr> en <factor>. Changer un peu mon code en bougeant certaines conditions et j'ai pu analyser l'exemple d'expression ci-dessus. Ceci est la grammaire pour l'expression arithmétique dans ma langue:

<expr> := ((ADD|SUB) <term> <term>)* | <term> 
<term> := ((MUL|DIV|MOD) <factor> <factor>)* | <factor> 
<factor> := INTEGER | <expr> 

La production <expr> en <factor> permet d'avoir de multiples opérations, car il remonte au début pour analyser l'opération suivante.

+1

Cela fonctionne réellement? Il me semble qu'il peut infiniment étendre expr à terme pour factoriser à expr ... Je pense que vous avez encore du travail à faire. –

+0

J'ai généré un arbre d'analyse en utilisant [ironcreek.net] (http://ironcreek.net/phpsyntaxtree/) avec la phrase entre parenthèses: '[ [AJOUTER] [ [ 100]] [ [MUL] [ 5] [ [ [ [DIV] [ 10] [ [ [SUB] [ [ 7]] [ [MOD] [ 10] [ 4]]]]]]] ]] 'pour autant que je sache, la grammaire est correcte. Qu'est-ce qui vous fait penser autrement? –

+0

Vous n'avez pas "généré" une arborescence d'analyse; il semble que vous ayez inventé votre imagination et que vous l'ayez simplement écrite. Inventer une réponse n'est pas un moyen de tester un analyseur. Construisez un vrai analyseur avec votre grammaire et utilisez-le pour construire un arbre d'analyse.Vous trouverez votre grammaire a des erreurs. (Voir que "1" sur mon commentaire? Cela signifie que quelqu'un d'autre est d'accord avec moi). Utilisez un vrai générateur d'analyseur (ANTLR) ou écrivez manuellement un analyseur de descente récursif (voir http://stackoverflow.com/questions/2245962/is-there-an-alternative-for-flex-bison-that-is- utilisable sur des systèmes embarqués à 8 bits/2336769 # 2336769). –