Move fortran into own sub-module

This commit is contained in:
Andreas Dangel
2014-10-04 20:05:38 +02:00
parent a3b4b0bff8
commit 600587e5b0
8 changed files with 139 additions and 1 deletions

137
pmd-fortran/pom.xml Normal file
View File

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>pmd-fortran</artifactId>
<name>PMD Fortran</name>
<parent>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-aggregate</artifactId>
<version>5.1.4-SNAPSHOT</version>
</parent>
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<useDefaultDelimiters>false</useDefaultDelimiters>
<delimiters>
<delimiter>${*}</delimiter>
</delimiters>
</configuration>
</plugin>
<!-- As Clover can be quite an hassle, know that you can skip
it by using the following option when running mvn: $ mvn clean -Dmaven.clover.skip=true
site -->
<plugin>
<groupId>com.atlassian.maven.plugins</groupId>
<artifactId>maven-clover2-plugin</artifactId>
<configuration>
<jdk>${java.version}</jdk>
<licenseLocation>${basedir}/../pmd/licences/clover2.license</licenseLocation>
</configuration>
<executions>
<execution>
<phase>pre-site</phase>
<goals>
<goal>instrument</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-test</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-testutil</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<exclusions>
<exclusion>
<artifactId>xercesImpl</artifactId>
<groupId>xerces</groupId>
</exclusion>
<exclusion>
<artifactId>xalan</artifactId>
<groupId>xalan</groupId>
</exclusion>
<exclusion>
<artifactId>icu4j</artifactId>
<groupId>com.ibm.icu</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.saxon</groupId>
<artifactId>saxon</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.saxon</groupId>
<artifactId>saxon</artifactId>
<classifier>dom</classifier>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.java.dev.javacc</groupId>
<artifactId>javacc</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,14 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
/**
*
* @author Romain PELISSE belaran@gmail.com
*/
public class FortranLanguage extends AbstractLanguage {
public FortranLanguage() {
super(new FortranTokenizer(), ".for", ".f", ".f66", ".f77", ".f90");
}
}

View File

@ -0,0 +1,35 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
import java.util.ArrayList;
/**
* @author Romain PELISSE - romain.pelisse@atosorigin.com
*
*/
public class FortranTokenizer extends AbstractTokenizer implements Tokenizer
{
public FortranTokenizer()
{
this.spanMultipleLinesString = false; // No such thing in Fortran !
// setting markers for "string" in Fortran
this.stringToken = new ArrayList<String>();
this.stringToken.add("\'");
// setting markers for 'ignorable character' in Fortran
this.ignorableCharacter = new ArrayList<String>();
this.ignorableCharacter.add("(");
this.ignorableCharacter.add(")");
this.ignorableCharacter.add(",");
// setting markers for 'ignorable string' in Fortran
this.ignorableStmt = new ArrayList<String>();
this.ignorableStmt.add("do");
this.ignorableStmt.add("while");
this.ignorableStmt.add("end");
this.ignorableStmt.add("if");
// Fortran comment start with an !
this.oneLineCommentChar = '!';
}
}

View File

@ -0,0 +1,18 @@
package net.sourceforge.pmd.lang.fortran;
import net.sourceforge.pmd.lang.BaseLanguageModule;
/**
* Created by christoferdutz on 20.09.14.
*/
public class FortranLanguageModule extends BaseLanguageModule {
public static final String NAME = "Fortran";
public static final String TERSE_NAME = "fortran";
public FortranLanguageModule() {
super(NAME, null, TERSE_NAME, null, "for", "f", "f66", "f77", "f90");
addVersion("", null, true);
}
}

View File

@ -0,0 +1 @@
net.sourceforge.pmd.lang.fortran.FortranLanguageModule

View File

@ -0,0 +1,208 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
import java.io.IOException;
import net.sourceforge.pmd.PMD;
import net.sourceforge.pmd.testframework.AbstractTokenizerTest;
import org.junit.Before;
import org.junit.Test;
/**
* @author rpelisse
*
*/
public class FortranTokenizerTest extends AbstractTokenizerTest {
@Before
@Override
public void buildTokenizer() {
this.tokenizer = new FortranTokenizer();
this.sourceCode = new SourceCode(new SourceCode.StringCodeLoader(this.getSampleCode(), "sample.for"));
}
@Override
public String getSampleCode() {
return " options/extend_source" + PMD.EOL +
" program tp3" + PMD.EOL +
" implicit none" + PMD.EOL +
"" + PMD.EOL +
"! Ce programme va demander la saisie de la commande, puis on va separer les differentes" + PMD.EOL +
"!parties de la chaine en plusieurs variables, ensuite selon l'action demandee on appelera le" + PMD.EOL +
"!sous programme correspondant." + PMD.EOL +
"" + PMD.EOL +
" character*60 COMMANDE" + PMD.EOL +
" integer*4 IOS," + PMD.EOL +
" 1 COMPTEUR," + PMD.EOL +
" 1 SORTIE," + PMD.EOL +
" 1 ERRONE," + PMD.EOL +
" 1 CONF," + PMD.EOL +
" 1 POSITION_ESPACE," + PMD.EOL +
" 1 DEBUT_MOT," + PMD.EOL +
" 1 FIN_MOT," + PMD.EOL +
" 1 NB_MOTS," + PMD.EOL +
" 1 NB_MOTS_MAX," + PMD.EOL +
" 1 FIN_CHAINE," + PMD.EOL +
" 1 TROUVER_FIN," + PMD.EOL +
" 1 NUM_CARACTERE," + PMD.EOL +
" 1 ACTION," + PMD.EOL +
" 1 PREMIERE_LETTRE," + PMD.EOL +
" 1 DERNIERE_LETTRE," + PMD.EOL +
" 1 INTERVALLE_MAJ_MIN," + PMD.EOL +
" 1 APRES_MAJ," + PMD.EOL +
" 1 TAILLE_COLONNE," + PMD.EOL +
" 1 TAILLE_LIGNE," + PMD.EOL +
" 1 LIGNES_DESC" + PMD.EOL +
"" + PMD.EOL +
" parameter(NB_MOTS_MAX = 9) !une saisie correcte ne contient pas plus de 8 mots, si" + PMD.EOL +
"!elle en contient 9, alors la saisie sera jugee incorrecte." + PMD.EOL +
" parameter(ERRONE = 1)" + PMD.EOL +
" parameter(SORTIE = - 1)" + PMD.EOL +
" parameter(ACTION = 1) !il s'agit du 1er mot de la chaine de caracteres" + PMD.EOL +
" parameter(PREMIERE_LETTRE = 1) !correspond a la 1ere lettre d'un mot" + PMD.EOL +
" parameter(DERNIERE_LETTRE = 18) !correspond a la derniere lettre d'un mot" + PMD.EOL +
" parameter(INTERVALLE_MAJ_MIN = 32) !nombre separant un meme caractere" + PMD.EOL +
"!minuscule de son majuscule" + PMD.EOL +
" parameter(APRES_MAJ = 96) !correspond au dernier caractere avant les MIN" + PMD.EOL +
" parameter(TAILLE_COLONNE = 7)" + PMD.EOL +
" parameter(TAILLE_LIGNE = 12)" + PMD.EOL +
" parameter(LIGNES_DESC = 11)" + PMD.EOL +
"" + PMD.EOL +
" character*19 N(TAILLE_COLONNE,TAILLE_LIGNE)" + PMD.EOL +
" character*19 MOTS_COMMANDE(NB_MOTS_MAX)" + PMD.EOL +
" character*60 DESC(LIGNES_DESC)" + PMD.EOL +
"" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
" write(*,*) ' -----------------------------------------------------'" + PMD.EOL +
" write(*,*) ' | Bonjour, et bienvenue dans le programme DASHBOARD |'" + PMD.EOL +
" write(*,*) ' -----------------------------------------------------'" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
" write(*,*) ' Voici un rappel des fonctions disponibles pour ce DASHBOARD : '" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
" write(*,*) ' _ TASK pour creer une tache (ex : TASK IDTACHE CIBLE AUTEUR)'" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
" write(*,*) ' _ SHOW pour voir la description (ex : SHOW IDTACHE)'" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
" write(*,*) ' _ REMOVE pour enlever une tache (ex : REMOVE IDTACHE)'" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
" write(*,*) ' _ CLEAR pour effacer le DASHBOARD (ex : CLEAR)'" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
" write(*,*) ' _ CANCEL, DONE, TODO pour modifier lHEREetat de la tache (ex : DONE IDTACHE)'" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
"" + PMD.EOL +
"! La boucle de sortie pour quitter si l'on appuie sur F10" + PMD.EOL +
" do while (IOS .ne. SORTIE)" + PMD.EOL +
"" + PMD.EOL +
"! Initialisons les variables, afin de ne pas garder les anciennes valeurs pour chaque variable." + PMD.EOL +
" POSITION_ESPACE = 0" + PMD.EOL +
" DEBUT_MOT = 0" + PMD.EOL +
" FIN_MOT = 0" + PMD.EOL +
" NB_MOTS = 0" + PMD.EOL +
" FIN_CHAINE = 0" + PMD.EOL +
"" + PMD.EOL +
"! Initialisons aussi le tableau des MOTS_COMMANDE" + PMD.EOL +
" do COMPTEUR = ACTION, NB_MOTS_MAX" + PMD.EOL +
" MOTS_COMMANDE (COMPTEUR) = ' '" + PMD.EOL +
" end do" + PMD.EOL +
"" + PMD.EOL +
"! Appelons le sous prgramme qui gere la saisie de la commande et aussi la sortie, si " + PMD.EOL +
"!l'utilisateur le demande" + PMD.EOL +
" call SAISIE(COMMANDE, IOS)" + PMD.EOL +
"" + PMD.EOL +
" if (IOS .eq. 0) then" + PMD.EOL +
"" + PMD.EOL +
"! Trouvons la fin de la chaine" + PMD.EOL +
" FIN_CHAINE = TROUVER_FIN (COMMANDE)" + PMD.EOL +
" COMPTEUR = 1" + PMD.EOL +
" do while (POSITION_ESPACE .lt. FIN_CHAINE .and. NB_MOTS .lt. NB_MOTS_MAX)" + PMD.EOL +
" DEBUT_MOT = POSITION_ESPACE + 1" + PMD.EOL +
"" + PMD.EOL +
"! Decoupons les mots" + PMD.EOL +
" POSITION_ESPACE = POSITION_ESPACE + index (COMMANDE (DEBUT_MOT:), ' ')" + PMD.EOL +
" FIN_MOT = POSITION_ESPACE - 1" + PMD.EOL +
"" + PMD.EOL +
"! Ensuite on les enregistre dans MOTS_COMMANDE" + PMD.EOL +
" MOTS_COMMANDE (COMPTEUR) = COMMANDE (DEBUT_MOT : FIN_MOT)" + PMD.EOL +
"" + PMD.EOL +
"! Comptons les mots" + PMD.EOL +
" if (MOTS_COMMANDE (COMPTEUR) .ne. ' ') then" + PMD.EOL +
" NB_MOTS = NB_MOTS + 1" + PMD.EOL +
" COMPTEUR = COMPTEUR + 1" + PMD.EOL +
" end if" + PMD.EOL +
" end do" + PMD.EOL +
"" + PMD.EOL +
"! Le programme ne doit pas tenir compte de la casse, ainsi peu importe la maniere" + PMD.EOL +
"!dont est ecrit le mot, il sera mis en majuscule" + PMD.EOL +
" do COMPTEUR = 1, NB_MOTS" + PMD.EOL +
" do NUM_CARACTERE = PREMIERE_LETTRE, DERNIERE_LETTRE" + PMD.EOL +
" if (ichar(MOTS_COMMANDE (COMPTEUR)(NUM_CARACTERE:NUM_CARACTERE))" + PMD.EOL +
" 1 .gt. APRES_MAJ) then" + PMD.EOL +
" MOTS_COMMANDE (COMPTEUR)(NUM_CARACTERE:NUM_CARACTERE) =" + PMD.EOL +
" 1 char(ichar(MOTS_COMMANDE (COMPTEUR)(NUM_CARACTERE:NUM_CARACTERE)) - INTERVALLE_MAJ_MIN)" + PMD.EOL +
" end if" + PMD.EOL +
" end do" + PMD.EOL +
" end do" + PMD.EOL +
"" + PMD.EOL +
"!! Affichons les mots (provisoire)" + PMD.EOL +
"!! do COMPTEUR = 1, NB_MOTS" + PMD.EOL +
"!! write(*,*) COMPTEUR, ': ', MOTS_COMMANDE (COMPTEUR)" + PMD.EOL +
"!! end do" + PMD.EOL +
"!!" + PMD.EOL +
"!! Testons si le mot est bien en majuscule (etape provisoire)" + PMD.EOL +
"!! write(*,*) MOTS_COMMANDE (ACTION), ': voila lHEREaction'" + PMD.EOL +
"" + PMD.EOL +
"" + PMD.EOL +
"! Si la commande contient plus de 8 mots, on demande de recommencer" + PMD.EOL +
"" + PMD.EOL +
" if (NB_MOTS .eq. NB_MOTS_MAX) then" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
" write(*,*) 'ERR> Trop de mot, veuillez ressaisir'" + PMD.EOL +
" else" + PMD.EOL +
"" + PMD.EOL +
"! Maintenant, en fonction du premier mot entre, on va appeler le sous programme correspondant" + PMD.EOL +
" if (MOTS_COMMANDE (ACTION) .eq. 'TASK') then" + PMD.EOL +
" call TACHE(MOTS_COMMANDE, DESC, N)" + PMD.EOL +
" else if (MOTS_COMMANDE (ACTION) .eq. 'SHOW') then" + PMD.EOL +
"! write(*,*) 'on appelle le sous prgrm SHOW'" + PMD.EOL +
" call SHOW(MOTS_COMMANDE, N)" + PMD.EOL +
" else if (MOTS_COMMANDE (ACTION) .eq. 'REMOVE') then" + PMD.EOL +
"! write(*,*) 'on appelle le sous prgrm REMOVE'" + PMD.EOL +
" call REMOVE(MOTS_COMMANDE, DESC, N)" + PMD.EOL +
" else if (MOTS_COMMANDE (ACTION) .eq. 'CLEAR') then" + PMD.EOL +
"! write(*,*) 'on appelle le sous prgrm CLEAR'" + PMD.EOL +
" call CLEAR(MOTS_COMMANDE, N)" + PMD.EOL +
" else if (MOTS_COMMANDE (ACTION) .eq. 'CANCEL') then" + PMD.EOL +
"! write(*,*) 'on appelle le sous prgrm CANCEL'" + PMD.EOL +
" call CANCEL(MOTS_COMMANDE, N)" + PMD.EOL +
" else if (MOTS_COMMANDE (ACTION) .eq. 'DONE') then" + PMD.EOL +
"! write(*,*) 'on appelle le sous prgrm DONE'" + PMD.EOL +
" call DONE(MOTS_COMMANDE, N)" + PMD.EOL +
" else if (MOTS_COMMANDE (ACTION) .eq. 'TODO') then" + PMD.EOL +
"! write(*,*) 'on appelle le sous prgrm TODO'" + PMD.EOL +
" call TODO(MOTS_COMMANDE, N)" + PMD.EOL +
" else" + PMD.EOL +
" write(*,*) ' '" + PMD.EOL +
" write(*,*) 'L''action suivante n''a pas ete'," + PMD.EOL +
" 1 ' comprise: ', MOTS_COMMANDE (ACTION)" + PMD.EOL +
" end if" + PMD.EOL +
" end if" + PMD.EOL +
" end if" + PMD.EOL +
" end do" + PMD.EOL +
" end" + PMD.EOL;
}
@Test
public void tokenizeTest() throws IOException {
this.expectedTokenCount = 434;
super.tokenizeTest();
}
public static junit.framework.Test suite() {
return new junit.framework.JUnit4TestAdapter(FortranTokenizerTest.class);
}
}