How to Parse CL Code
This is the most basic of examples: it shows how to parse some CL code into a CLCompilationUnit.
Add Dependencies
- Kotlin
- Java
repositories {
mavenLocal()
mavenCentral()
flatDir {
dirs("deps")
}
}
dependencies {
implementation(files("deps/clparser-with-dependencies-1.0.1-all.jar"))
}
repositories {
mavenLocal()
mavenCentral()
flatDir {
dirs("deps")
}
}
dependencies {
implementation(files("deps/clparser-with-dependencies-1.0.1-all.jar"))
implementation "com.strumenta.kolasu:kolasu-javalib:1.5.107"
}
Parse a file
Create a CLKolasuParser, register your license, and call parse. The root of a successful parse is a CLCompilationUnit. Pass parseComments = true when you need block comments (/* … */) attached to the compilation unit.
- Kotlin
- Java
import com.strumenta.cl.model.CLCompilationUnit
import com.strumenta.cl.model.DeclareVariableCommand
import com.strumenta.cl.model.Procedure
import com.strumenta.cl.parser.CLKolasuParser
import com.strumenta.kolasu.commercial.LicenseManager
import com.strumenta.kolasu.parsing.ParsingResult
import com.strumenta.kolasu.traversing.walkDescendants
import java.io.File
fun processCLFile(clFile: File, license: File) {
println("== Processing CL file ${clFile.path} ==\n")
if (!clFile.exists() || !clFile.isFile) {
println("File not found or not a file, skipping")
return
}
LicenseManager.registerLicense(license)
val parser = CLKolasuParser(parseComments = true)
val result: ParsingResult<CLCompilationUnit> = parser.parse(clFile)
if (result.issues.isNotEmpty()) {
println("Issues in file: ${result.issues.size}")
result.issues.forEach { println(" - $it") }
}
val root = result.root
if (root == null) {
println("Compilation unit not built, skipping")
return
}
println("Procedures (PGM…ENDPGM): ${root.procedures.size}")
println("Top-level commands: ${root.commands.size}")
println("Top-level subroutines: ${root.subroutines.size}")
if (root.comments.isNotEmpty()) {
println("Comments collected: ${root.comments.size}")
}
val dclCount = root.walkDescendants(DeclareVariableCommand::class).count()
println("DCL variables: $dclCount")
}
import com.strumenta.cl.model.CLCompilationUnit;
import com.strumenta.cl.model.DeclareVariableCommand;
import com.strumenta.cl.parser.CLKolasuParser;
import com.strumenta.kolasu.commercial.LicenseManager;
import com.strumenta.kolasu.javalib.Traversing;
import com.strumenta.kolasu.parsing.ParsingResult;
import java.io.File;
import java.util.concurrent.atomic.AtomicInteger;
private static void processCLFile(File clFile, File license) {
System.out.println("== Processing CL file " + clFile.getPath() + " ==\n");
if (!clFile.exists() || !clFile.isFile()) {
System.out.println("File not found or not a file, skipping");
return;
}
LicenseManager.INSTANCE.registerLicense(license);
CLKolasuParser parser = new CLKolasuParser(/* parseComments */ true);
ParsingResult<CLCompilationUnit> result = parser.parse(clFile);
if (!result.getIssues().isEmpty()) {
System.out.println("Issues in file: " + result.getIssues().size());
result.getIssues().forEach(issue -> System.out.println(" - " + issue));
}
CLCompilationUnit root = result.getRoot();
if (root == null) {
System.out.println("Compilation unit not built, skipping");
return;
}
System.out.println("Procedures (PGM…ENDPGM): " + root.getProcedures().size());
System.out.println("Top-level commands: " + root.getCommands().size());
System.out.println("Top-level subroutines: " + root.getSubroutines().size());
if (!root.getComments().isEmpty()) {
System.out.println("Comments collected: " + root.getComments().size());
}
AtomicInteger dclCount = new AtomicInteger();
Traversing.walkDescendantsBreadthFirst(root, DeclareVariableCommand.class, dcl -> dclCount.incrementAndGet());
System.out.println("DCL variables: " + dclCount.get());
}
You can use the method we just created very easily.
- Kotlin
- Java
fun main() {
processCLFile(
File("examples/arithmetic.cl"),
File("licenses/strumenta.license"),
)
}
public static void main(String[] args) {
processCLFile(
new File("examples/arithmetic.cl"),
new File("licenses/strumenta.license"));
}
Supported extensions include .cl, .clp, and .clle. The same parse overloads accept a String, a File, or an InputStream with an explicit source.