What's CommandExtractor

CommandExtractor is the simpler Progress 4GL parser used internally by Justus tools. It uses some basic rules to strip an input source file into generic statements.
The table bellow shows a sample source file processed by CommandExtractor.

Extracted Statements
Line Code
1
/******************************************************
** This is a sample source code for testing parser.
** Author: Flavio Eduardo de Córdova
******************************************************/
6
DEFINE TEMP-TABLE ttLogging     NO-UNDO
    FIELD custName          AS CHARACTER
    FIELD callDuration      AS DECIMAL
    INDEX custName
        custName.
12
DEFINE TEMP-TABLE ttSumary      NO-UNDO
    FIELD custName          AS CHARACTER
    FIELD totalDuration     AS DECIMAL.
16
RUN generateRandomData.
17
RUN sumarize.
18
RUN cleanUp.
21
PROCEDURE generateRandomData PRIVATE:
22
    &SCOPED-DEFINE EXTENT_SIZE  5
23
    DEFINE VARIABLE cAvailableCustomers     AS CHARACTER EXTENT {&EXTENT_SIZE} NO-UNDO
            INITIAL ["~"cust1~"", '"cust2"', "'cust3'", '~'cust4~'', "cust5"].
26
    DEFINE VARIABLE iEntries        AS INTEGER          NO-UNDO.
28
    generation:
29
    DO iEntries = 1 TO 100:
30
        CREATE ttLogging.
31
        ASSIGN
            ttLogging.custName     = cAvailableCustomers[(iEntries MOD {&EXTENT_SIZE}) + 1]
            ttLogging.callDuration = RANDOM(1, 1500) / 100.
34
    END.
35
END.
37
PROCEDURE sumarize PRIVATE:
38
    DEFINE BUFFER ttLoggingBuffer   FOR ttLogging.
39
    FOR EACH ttLoggingBuffer
        BREAK BY ttLoggingBuffer.custName:
41
        IF FIRST-OF(ttLoggingBuffer.custName) THEN DO:
42
            CREATE ttSumary.
43
            ttSumary.custName = ttLoggingBuffer.custName.
44
        END.
45
        ttSumary.totalDuration = ttSumary.totalDuration + ttLoggingBuffer.callDuration.
46
    END.
47
END.
49
PROCEDURE cleanUp PRIVATE:
50
    FOR EACH ttSumary
        EXCLUSIVE-LOCK:
52
        DELETE ttSumary.
53
    END.
55
    FOR EACH ttLogging
        EXCLUSIVE-LOCK:
57
        DELETE ttLogging.
58
    END.
59
END.

Sample Code


The table below shows the Java code used to extract Progress statements:

CommandExtractor sample code
import net.cordova.justus.progressparser.*;
import java.io.*;

public class MyTest implements CommandListener {
	public static void main(String args[]) {
		File f = new File(args[0]);
		try {
			CommandExtractor extractor = new CommandExtractor(f);
			extractor.addCommandListener(new MyTest());
			extractor.analiseCode();
		}
		catch(Exception e) {
			Sysout.err.println("Error: " + e.getMessage());
		}
	}
	
	public void commandRead(ProgressStatement command) {
		System.out.println(command);
	}
}