Mais par définition si je n'ais aucune classe qui s'appelle Cobolparser, je ne peux pas avoir Cobolparseur dans mon constructeur
Version imprimable
Mais par définition si je n'ais aucune classe qui s'appelle Cobolparser, je ne peux pas avoir Cobolparseur dans mon constructeur
Alors dans le tuto officiel de jtb il est écrit ceci ;
va voir ici : http://compilers.cs.ucla.edu/jtb/jtb-2003/tutorial.htmlCitation:
* Run JTB on the grammar. On Unix systems, this would be done with the following command:
% jtb Java1.1.jj
This will generate the syntaxtree directory which contains your tree node classes, the visitor directory which contains Visitor interface, DepthFirstVisitor class, ObjectVisitor interface and ObjectDepthFirst class, and jtb.out.jj, the grammar file with code inserted to build the syntax tree.
* Run JavaCC on the annotated grammar file to generate the parser.
Il semble manquer cette étape à ton autre tuto...
Cela ne marche toujours pas, je suis vraiment perdu et je dois rendre cela pour ce soir.
Ce qui est le plus embêtant c'est que je suis tout proche de la solution d'après moi, il n'y a que un problème avec ce main, car toute l'exécution avec JTB ce déroule parfaitement et je trouve exactement les fichiers et l'architecture que je dois trouver, mais il me manque juste cette classe qui est présente dans mon main.
Je pense que une spécialiste java devrait comprendre mon problème.
Help please
PS: tous mes fichiers sont encore disponible à l'adresse suivante http://asbrechaumont.com/astcobol/
Salut
D'après le tuto de JTB, ton parser est généré par javaCC et non pas JTB.
Il ne faut pas être spécialiste en java, c'est juste qu'il faut connaitre l'outil. TU as essayé de générer le parser comme dans le tuto de JTB, avec la gammaire générée par JTB ?
J'ai appliquer JavaCC qui ma retourné 5 fichiers .java
CobolParser.java
CobolParserConstants.java
CobolParserTokenManager.java
SimpleCharStream.java
Token.java
TokenMgrError.java
Dont le fameux CobolParser.
J'ai donc écris mon main :
Et maintenant il me trouve l'erreur suivante lors de la compilation :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 import java.io.File; import java.io.FileInputStream; import syntaxtree.CompilationUnit; import visitor.TreeDumper; import visitor.TreeFormatter; public class main { /** * @param args * @return */ public main(){ parse("/home/wje/Bureau/testcobol.cobol"); System.out.println("How many rows?"); } public static void parse( String source ) { try { System.out.println("How many rows?"); // open the source file File source_file = new File( source ); FileInputStream is = new FileInputStream( source_file ); // starts parsing CobolParser parser = new CobolParser( is ); CompilationUnit unit = parser.CompilationUnit(); // creates a formatter visitor TreeFormatter fmt = new TreeFormatter(); fmt.visit( unit ); // creates a dumper visitor TreeDumper dump = new TreeDumper(); dump.visit( unit ); } catch( Exception ex ) { ex.printStackTrace(); } } }
Citation:
Exception in thread "main" java.lang.NoClassDefFoundError: main/java
Caused by: java.lang.ClassNotFoundException: main.java
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
Tu compiles à la main ou toujours dans eclipse ?
Ca me parait bizarre comme exception ca. Tu as bien inclus les classes dans eclipse ? dans le bon package ?
La on dirat que tu as fait un truc du genre :
pour exécuter.Code:
1
2 $ java main.java
Tu peux m'en dire plus ?
J'ai refait un projet car il y avais des erreurs? les fichiers généré devait être importé dans leur package et de plus mon main n'étais pas reconnu ( faut d'inattention ).
J'ai recrée le tout et maintenant je n'ais plus d'erreur ( juste des warning de type never read ) et pour cause quand j'execute mon projet il me sort une erreur de type :
Exception in thread "main" java.lang.NoSuchMethodError: main
Si tu veux voir le code ou exécuter le projet chez toi pour voir ce qui ne colle pas tu peux aller voir sur http://asbrechaumont.com/astcobol/ j'ai remis mon nouveau projet qui semble plus cohérent que l'ancien.
Comme le dit le message d'erreur, pour exécuter un programme en java, comme en C, il te faut une méthode main de signature suivante :
Dans cette méthode tu appelles par exemple ta méthode parse ainsi :Code:
1
2
3
4 public static void main(String[] args) { ... }
si ton fichier à parser est donné en paramètre dans la ligne de commande après ton programmeCode:
1
2 parse(args[1]);
Merci d'avoir répondu,
Mais quand je mais public static void main(String[] args) {
Il me dis warning the method has a constructor name.
( je l'avais déjà mis avant, mais je l'ai enlevé pour cela. )
Maintenant il me mais une autre erreur ( ca progresse )
testparser.ParseException: Encountered "SUBTRACT" at line 1, column 6.
Was expecting:
"identification" ...
at testparser.CobolParser.generateParseException(CobolParser.java:30495)
at testparser.CobolParser.jj_consume_token(CobolParser.java:30339)
at testparser.CobolParser.IdentificationDivision(CobolParser.java:1933)
at testparser.CobolParser.ProgramUnit(CobolParser.java:1850)
at testparser.CobolParser.CompilationUnit(CobolParser.java:1798)
at main.parse(main.java:28)
at main.main(main.java:16)
Bon ben ton parser marche maintenant...
Le problème vient de ton fichier en cobol que tu parses, il n'est pas conforme à la grammaire...
Sinon pour le warning c'est aprce que tu as appelé ta classe main.
Tu devrais respecter les conventions de nommage : les noms des classes commencent par une majuscule, les noms de méthodes par une minuscule...
Bref ton problème est résolu, si le fichier source n'est pas conforme à ta grammaire, c'est
- soit ta grammaire n'est pas la bonne version pour le programme écrit
- soit ton programme ne respecte pas la grammaire
Tout dépend si tu cherches une grammaire s'adaptant à ton programme ou si tu as écrit un programme censé suivre ta grammaire...
Je ne sais pas si ton programme a une erreur à dessein ou non. Bref là faut voir avec ton chef, quelle version de cobol il utilise et si tout est compatible...
Ok merci beaucoup pour votre aide.
Donc si j'ai un fichier cobol avec la même grammaire que celle que j'ai insérée dans mon programme cela devrait m'afficher un ast ???
Ben en théorie oui si ton fichier cobol suit la grammaire dont tu as un parser, il sera accepté et un AST sera construit...
Oublie pas :resolu: (bouton en bas de la discussion)
Merci beaucoup pour tous, je suis plus spécialisé dans le réseau le citrix et particulièrement les solutions open-source comme alfresco ou asterisk.
Alors si tu as un problème de ce type Georges n'hésite pas à me contacter.
Malheureusement je viens de tester avec du code cobol, mais mon parseur ne reconnaît pas les commentaire ni les requête sql, de plus aucun ast n'est généré, à la fin de l'exécution seul le programme se ré affiche sans aucun changement.
:roll:
Ben tout dépend de ta grammaire, je ne l'ai pas lue, je ne sais pas pour quelle version de cobol elle est valable... Il faut regarder dedans, tu as peut-être des commentaires qui t'indiqueront ce qui est supporté. Si ton parser ne reconnait pas le SQL c'est peut-être parce que c'est un parser pour cobol... On ne peut pas compiler du Java avec gcc ;)
Et pour mon ast? il devrait apparaître ou?
Aucune idée moi, tu as fait quoi comme visiteur ? Regarde un peu les concepts utilisés, renseigne toi sur le net là dessus
Salut à tous!
Et bien je dois faire exactement la même chose ;-).
J'ai bien tout généré grâce à javaCC et JTB, avec le .jj de Bernard Pinon
Et mon main ne marche pas: leurs exemples appellent une méthode void pour récupérer un node:
L'erreur:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.objectweb.petals.parsercobol; import org.objectweb.petals.parsercobol.syntaxtree.Node; import org.objectweb.petals.parsercobol.visitor.DepthFirstVisitor; public class Main { /** * @param args */ public static void main(String[] args) { CobolParser parser = new CobolParser(System.in); try { Node root = parser.CompilationUnit(); System.err.println("Cobol program parsed successfully."); root.accept(new DepthFirstVisitor()); } catch (ParseException e) { System.err.println("Encountered errors during parse."); } } }
Et en effet la méthode est statique et void:Code:Type mismatch: cannot convert from void to Node
Déjà tu utilisais quoi comme version de javacc (j'ai la 4.1) et de jtb (j'ai la 1.3.2)?Code:static final public void CompilationUnit() throws ParseException {...}
Merci d'avance à celui qui a une idée!
J'ai la même version de javacc et de jtb.
Moi il me retourne uniquement le code sans aucun nouveau formatage dans la console, il ne génère pas d'ast et ne prend pas en compte les commentaire et les requêtes sql.
@Jerem285 si il ne prend pas en compte le sql comme je te l'avais dit, c'est parce que tu n'as pas une grammaire pour le sql mais pour le cobol... un parser ne peut pas tout comprendre, de meme que tu ne parles pas toutes les langues existantes. Il faut bien comprendre qu'un parser ne peut comprendre que la grammaire que tu lui as donnée, donc pour tes commentaires, si ils ne suivent pas un format décrit dans la grammaire, il ne les reconnaitra pas non plus.
Enfin pour la sortie, bien sûr qu'il te construit un ast en parsant (si ton programme d'entrée est correct) mais il ne t'affiche que ce que tu lui as dit d'afficher avec un visiteur. Bref tiens compte de mes remarques et fais quelques recherches sur le sujet des visiteurs si tu ne connais pas. De meme lis la doc de jtb pour voir ce qu'il faut faire comme visiteur. Il y a surement des exemples sur leur site.
@tigroo31 tu as pris la meme grammaire que jerem285 ? tu as suivi les memes étapes ?