Changeset - a12023821ace
[Not reviewed]
Merge
! ! !
Max Henger - 3 years ago 2022-02-08 15:16:13
henger@cwi.nl
Merge branch 'feat-compiler-bin' into 'master'

feat: compiler binary

See merge request nl-cwi-csy/reowolf!2
124 files changed with 276 insertions and 1642 deletions:
0 comments (0 inline, 0 general)
Cargo.toml
Show inline comments
 
@@ -6,7 +6,7 @@ authors = [
 
	"Christopher Esterhuyse <esterhuy@cwi.nl>",
 
	"Hans-Dieter Hiep <hdh@cwi.nl>"
 
]
 
edition = "2018"
 
edition = "2021"
 

	
 
[dependencies]
 
# convenience macros
bin-compiler/Cargo.toml
Show inline comments
 
new file 100644
 
[package]
 
name = "reowolf_compiler"
 
version = "0.1.0"
 
authors = [
 
    "Max Henger <henger@cwi.nl>",
 
    "Christopher Esterhuyse <esterhuy@cwi.nl>",
 
    "Hans-Dieter Hiep <hdh@cwi.nl>"
 
]
 
edition = "2021"
 

	
 
[dependencies]
 
reowolf_rs = { path = "../" }
 
clap = "3.0"
 
\ No newline at end of file
bin-compiler/src/main.rs
Show inline comments
 
new file 100644
 
use std::fs::File;
 
use std::io::Read;
 

	
 
use clap::{App, Arg};
 
use reowolf_rs as rw;
 

	
 
fn main() {
 
    let app = App::new("rwc")
 
        .author("Henger, M.")
 
        .version(env!("CARGO_PKG_VERSION"))
 
        .about("Reowolf compiler")
 
        .arg(
 
            Arg::new("input")
 
                .long("input")
 
                .short('i')
 
                .help("input files")
 
                .required(true)
 
                .takes_value(true)
 
                .multiple_occurrences(true)
 
        )
 
        .arg(
 
            Arg::new("threads")
 
                .long("threads")
 
                .short('t')
 
                .help("number of runtime threads")
 
                .default_value("1")
 
                .takes_value(true)
 
        )
 
        .arg(
 
            Arg::new("debug")
 
                .long("debug")
 
                .short('d')
 
                .help("enable debug logging")
 
        );
 

	
 
    // Retrieve arguments and convert
 
    let app = app.get_matches();
 
    let input_files = app.values_of("input");
 
    if input_files.is_none() {
 
        println!("ERROR: Expected at least one input file");
 
        return;
 
    }
 

	
 
    let num_threads = app.value_of("threads").unwrap();
 
    let num_threads = match num_threads.parse::<i32>() {
 
        Ok(num_threads) => {
 
            if num_threads < 0 || num_threads > 255 {
 
                println!("ERROR: Number of threads must be a number between 0 and 256");
 
                return;
 
            }
 

	
 
            num_threads as u32
 
        },
 
        Err(err) => {
 
            println!("ERROR: Failed to parse number of threads\nbecause: {}", err);
 
            return;
 
        }
 
    };
 

	
 
    let debug_enabled = app.is_present("debug");
 

	
 
    // Add input files to file buffer
 
    let input_files = input_files.unwrap();
 
    assert!(input_files.len() > 0); // because arg is required
 

	
 
    let mut builder = rw::ProtocolDescriptionBuilder::new();
 
    let mut file_buffer = Vec::with_capacity(4096);
 

	
 
    for input_file in input_files {
 
        print!("Adding file: {} ... ", input_file);
 
        let mut file = match File::open(input_file) {
 
            Ok(file) => file,
 
            Err(err) => {
 
                println!("FAILED (to open file)\nbecause:\n{}", err);
 
                return;
 
            }
 
        };
 

	
 
        file_buffer.clear();
 
        if let Err(err) = file.read_to_end(&mut file_buffer) {
 
            println!("FAILED (to read file)\nbecause:\n{}", err);
 
            return;
 
        }
 

	
 
        if let Err(err) = builder.add(input_file.to_string(), file_buffer.clone()) {
 
            println!("FAILED (to tokenize file)\nbecause:\n{}", err);
 
        }
 

	
 
        println!("Success");
 
    }
 

	
 
    // Compile the program
 
    print!("Compiling program ... ");
 
    let protocol_description = match builder.compile() {
 
        Ok(pd) => pd,
 
        Err(err) => {
 
            println!("FAILED\nbecause:\n{}", err);
 
            return;
 
        }
 
    };
 

	
 
    println!("Success");
 

	
 
    // Make sure there is a nameless module with a main component
 
    print!("Creating main component ... ");
 
    let runtime = rw::runtime2::Runtime::new(num_threads, debug_enabled, protocol_description);
 
    if let Err(err) = runtime.create_component(b"", b"main") {
 
        use rw::ComponentCreationError as CCE;
 
        let reason = match err {
 
            CCE::ModuleDoesntExist => "Input files did not contain a nameless module (that should contain the 'main' component)",
 
            CCE::DefinitionDoesntExist => "Input files did not contain a component called 'main'",
 
            CCE::DefinitionNotComponent => "Input file contained a 'main' function, but not a 'main' component",
 
            _ => "Unexpected error"
 
        };
 
        println!("FAILED\nbecause:\n{} (raw error: {:?})", reason, err);
 
        return;
 
    }
 

	
 
    println!("Success");
 
    println!("Now running until all components have exited");
 
    println!("--------------------------------------------\n\n");
 
}
 
\ No newline at end of file
src/lib.rs
Show inline comments
 
@@ -7,4 +7,4 @@ pub mod runtime;
 
pub mod runtime2;
 
mod collections;
 

	
 
pub use protocol::ProtocolDescription;
 
\ No newline at end of file
 
pub use protocol::{ProtocolDescription, ProtocolDescriptionBuilder, ComponentCreationError};
 
\ No newline at end of file
src/protocol/mod.rs
Show inline comments
 
@@ -46,11 +46,6 @@ pub enum ComponentCreationError {
 
    InSync,
 
}
 

	
 
impl std::fmt::Debug for ProtocolDescription {
 
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
 
        write!(f, "(An opaque protocol description)")
 
    }
 
}
 
impl ProtocolDescription {
 
    pub fn parse(buffer: &[u8]) -> Result<Self, String> {
 
        let source = InputSource::new(String::new(), Vec::from(buffer));
 
@@ -217,3 +212,41 @@ pub trait RunContext {
 
    fn performed_fork(&mut self) -> Option<bool>; // None if not yet forked
 
    fn created_channel(&mut self) -> Option<(Value, Value)>; // None if not yet prepared
 
}
 

	
 
pub struct ProtocolDescriptionBuilder {
 
    parser: Parser,
 
}
 

	
 
impl ProtocolDescriptionBuilder {
 
    pub fn new() -> Self {
 
        return Self{
 
            parser: Parser::new(),
 
        }
 
    }
 

	
 
    pub fn add(&mut self, filename: String, buffer: Vec<u8>) -> Result<(), ParseError> {
 
        let input = InputSource::new(filename, buffer);
 
        self.parser.feed(input)?;
 

	
 
        return Ok(())
 
    }
 

	
 
    pub fn compile(mut self) -> Result<ProtocolDescription, ParseError> {
 
        self.parser.parse()?;
 

	
 
        let modules: Vec<Module> = self.parser.modules.into_iter()
 
            .map(|module| Module{
 
                source: module.source,
 
                root_id: module.root_id,
 
                name: module.name.map(|(_, name)| name)
 
            })
 
            .collect();
 

	
 
        return Ok(ProtocolDescription {
 
            modules,
 
            heap: self.parser.heap,
 
            types: self.parser.type_table,
 
            pool: Mutex::new(self.parser.string_pool),
 
        });
 
    }
 
}
src/protocol/parser/pass_symbols.rs
Show inline comments
 
@@ -64,10 +64,10 @@ impl PassSymbols {
 

	
 
        // Retrieve first range index, then make immutable borrow
 
        let mut range_idx = module_range.first_child_idx;
 
        let module = &modules[module_idx];
 

	
 
        // Visit token ranges to detect definitions and pragmas
 
        loop {
 
            let module = &modules[module_idx];
 
            let range_idx_usize = range_idx as usize;
 
            let cur_range = &module.tokens.ranges[range_idx_usize];
 
            let next_sibling_idx = cur_range.next_sibling_idx;
 
@@ -102,14 +102,15 @@ impl PassSymbols {
 
        root.pragmas.extend(self.pragmas.drain(..));
 
        root.definitions.extend(self.definitions.drain(..));
 

	
 
        // Modify module
 
        let module = &mut modules[module_idx];
 
        module.phase = ModuleCompilationPhase::SymbolsScanned;
 

	
 
        Ok(())
 
    }
 

	
 
    fn visit_pragma_range(&mut self, modules: &[Module], module_idx: usize, ctx: &mut PassCtx, range_idx: usize) -> Result<(), ParseError> {
 
        let module = &modules[module_idx];
 
    fn visit_pragma_range(&mut self, modules: &mut [Module], module_idx: usize, ctx: &mut PassCtx, range_idx: usize) -> Result<(), ParseError> {
 
        let module = &mut modules[module_idx];
 
        let range = &module.tokens.ranges[range_idx];
 
        let mut iter = module.tokens.iter_range(range);
 

	
 
@@ -139,7 +140,7 @@ impl PassSymbols {
 
            }));
 
            self.pragmas.push(pragma_id);
 

	
 
            if let Err(other_module_root_id) = ctx.symbols.insert_module(module_name, module.root_id) {
 
            if let Err(other_module_root_id) = ctx.symbols.insert_module(module_name.clone(), module.root_id) {
 
                // Naming conflict
 
                let this_module = &modules[module_idx];
 
                let other_module = seek_module(modules, other_module_root_id).unwrap();
 
@@ -151,6 +152,8 @@ impl PassSymbols {
 
                    &other_module.source, other_pragma.span, "other module is defined here"
 
                ));
 
            }
 

	
 
            module.name = Some((pragma_id, module_name));
 
            self.has_pragma_module = true;
 
        } else if pragma_section == b"#version" {
 
            // Check if version is defined twice within the same file
 
@@ -166,6 +169,8 @@ impl PassSymbols {
 
                version,
 
            }));
 
            self.pragmas.push(pragma_id);
 

	
 
            module.version = Some((pragma_id, version as i64));
 
            self.has_pragma_version = true;
 
        } else {
 
            // Custom pragma, maybe we support this in the future, but for now
src/runtime2/component/component_pdl.rs
Show inline comments
 
@@ -672,7 +672,6 @@ impl CompPDL {
 
                    },
 
                    None => {
 
                        // Peer port remains with creator component.
 
                        println!("DEBUG: Setting peer for port {:?} of component {:?} to {:?}", created_port_info.self_id, reservation.id(), creator_ctx.id);
 
                        created_port_info.peer_comp_id = creator_ctx.id;
 
                        created_ctx.add_peer(pair.created_handle, sched_ctx, creator_ctx.id, None);
 
                    }
src/runtime2/mod.rs
Show inline comments
 
@@ -3,4 +3,6 @@ mod runtime;
 
mod component;
 
mod communication;
 
mod scheduler;
 
#[cfg(test)] mod tests;
 
\ No newline at end of file
 
#[cfg(test)] mod tests;
 

	
 
pub use runtime::Runtime;
 
\ No newline at end of file
src/runtime2/runtime.rs
Show inline comments
 
@@ -158,7 +158,8 @@ pub struct Runtime {
 
}
 

	
 
impl Runtime {
 
    pub fn new(num_threads: u32, protocol_description: ProtocolDescription) -> Runtime {
 
    // TODO: debug_logging should be removed at some point
 
    pub fn new(num_threads: u32, debug_logging: bool, protocol_description: ProtocolDescription) -> Runtime {
 
        assert!(num_threads > 0, "need a thread to perform work");
 
        let runtime_inner = Arc::new(RuntimeInner {
 
            protocol: protocol_description,
 
@@ -173,7 +174,7 @@ impl Runtime {
 
        };
 

	
 
        for thread_index in 0..num_threads {
 
            let mut scheduler = Scheduler::new(runtime.inner.clone(), thread_index);
 
            let mut scheduler = Scheduler::new(runtime.inner.clone(), thread_index, debug_logging);
 
            let thread_handle = std::thread::spawn(move || {
 
                scheduler.run();
 
            });
 
@@ -183,6 +184,20 @@ impl Runtime {
 

	
 
        return runtime;
 
    }
 

	
 
    pub fn create_component(&self, module_name: &[u8], routine_name: &[u8]) -> Result<(), ComponentCreationError> {
 
        use crate::protocol::eval::ValueGroup;
 
        let prompt = self.inner.protocol.new_component(
 
            module_name, routine_name,
 
            ValueGroup::new_stack(Vec::new())
 
        )?;
 
        let reserved = self.inner.start_create_pdl_component();
 
        let ctx = CompCtx::new(&reserved);
 
        let (key, _) = self.inner.finish_create_pdl_component(reserved, CompPDL::new(prompt, 0), ctx, false);
 
        self.inner.enqueue_work(key);
 

	
 
        return Ok(())
 
    }
 
}
 

	
 
impl Drop for Runtime {
 
@@ -259,33 +274,6 @@ impl RuntimeInner {
 
        return (CompKey(index), component);
 
    }
 

	
 
    /// Creates a new component. Note that the public part will be properly
 
    /// initialized, but not all private fields are.
 
    pub(crate) fn create_pdl_component(&self, comp: CompPDL, ctx: CompCtx, initially_sleeping: bool) -> (CompKey, &mut RuntimeComp) {
 
        let inbox_queue = QueueDynMpsc::new(16);
 
        let inbox_producer = inbox_queue.producer();
 
        let comp = RuntimeComp{
 
            public: CompPublic{
 
                sleeping: AtomicBool::new(initially_sleeping),
 
                num_handles: AtomicU32::new(1), // the component itself acts like a handle
 
                inbox: inbox_producer,
 
            },
 
            code: comp,
 
            ctx,
 
            inbox: inbox_queue,
 
            exiting: false,
 
        };
 

	
 
        let index = self.components.create(comp);
 

	
 
        // TODO: just do a reserve_index followed by a consume_index or something
 
        self.increment_active_components();
 
        let component = self.components.get_mut(index);
 
        component.ctx.id = CompId(index);
 

	
 
        return (CompKey(index), component);
 
    }
 

	
 
    pub(crate) fn get_component(&self, key: CompKey) -> &mut RuntimeComp {
 
        let component = self.components.get_mut(key.0);
 
        return component;
src/runtime2/scheduler.rs
Show inline comments
 
@@ -8,42 +8,49 @@ use super::runtime::*;
 
pub(crate) struct Scheduler {
 
    runtime: Arc<RuntimeInner>,
 
    scheduler_id: u32,
 
    debug_logging: bool,
 
}
 

	
 
pub(crate) struct SchedulerCtx<'a> {
 
    pub runtime: &'a RuntimeInner,
 
    pub id: u32,
 
    pub comp: u32,
 
    pub logging_enabled: bool,
 
}
 

	
 
impl<'a> SchedulerCtx<'a> {
 
    pub fn new(runtime: &'a RuntimeInner, id: u32) -> Self {
 
    pub fn new(runtime: &'a RuntimeInner, id: u32, logging_enabled: bool) -> Self {
 
        return Self {
 
            runtime,
 
            id,
 
            comp: 0,
 
            logging_enabled,
 
        }
 
    }
 

	
 
    pub(crate) fn log(&self, text: &str) {
 
        println!("[s:{:02}, c:{:03}] {}", self.id, self.comp, text);
 
        if self.logging_enabled {
 
            println!("[s:{:02}, c:{:03}] {}", self.id, self.comp, text);
 
        }
 
    }
 

	
 
    // TODO: Obviously remove, but useful for testing
 
    pub(crate) fn log_special(&self, text: &str) {
 
        println!("[s:{:02}, c:{:03}] *** *** {}", self.id, self.comp, text);
 
        if self.logging_enabled {
 
            println!("[s:{:02}, c:{:03}] *** *** {}", self.id, self.comp, text);
 
        }
 
    }
 
}
 

	
 
impl Scheduler {
 
    // public interface to thread
 

	
 
    pub fn new(runtime: Arc<RuntimeInner>, scheduler_id: u32) -> Self {
 
        return Scheduler{ runtime, scheduler_id }
 
    pub fn new(runtime: Arc<RuntimeInner>, scheduler_id: u32, debug_logging: bool) -> Self {
 
        return Scheduler{ runtime, scheduler_id, debug_logging }
 
    }
 

	
 
    pub fn run(&mut self) {
 
        let mut scheduler_ctx = SchedulerCtx::new(&*self.runtime, self.scheduler_id);
 
        let mut scheduler_ctx = SchedulerCtx::new(&*self.runtime, self.scheduler_id, self.debug_logging);
 

	
 
        'run_loop: loop {
 
            // Wait until we have something to do (or need to quit)
src/runtime2/tests/mod.rs
Show inline comments
 
@@ -23,7 +23,7 @@ fn test_component_creation() {
 
        auto b = 5 + a;
 
    }
 
    ").expect("compilation");
 
    let rt = Runtime::new(1, pd);
 
    let rt = Runtime::new(1, true, pd);
 

	
 
    for i in 0..20 {
 
        create_component(&rt, "", "nothing_at_all", no_args());
 
@@ -80,6 +80,6 @@ fn test_component_communication() {
 
        new sender(o_mrmm, 5, 5);
 
        new receiver(i_mrmm, 5, 5);
 
    }").expect("compilation");
 
    let rt = Runtime::new(3, pd);
 
    let rt = Runtime::new(3, true, pd);
 
    create_component(&rt, "", "constructor", no_args());
 
}
 
\ No newline at end of file
testdata/basic-modules/consumer.pdl
Show inline comments
 
new file 100644
 
#module consumer
 

	
 
primitive consumer(in<u32> input) {
 
    sync {
 
        print("C: going to receive a value");
 
        auto v = get(input);
 
        print("C: I have received a value");
 
    }
 
    print("C: I am now exiting");
 
}
 
\ No newline at end of file
testdata/basic-modules/main.pdl
Show inline comments
 
new file 100644
 
import consumer as c;
 
import producer::producer;
 

	
 
composite main() {
 
    channel output -> input;
 
    new c::consumer(input);
 
    new producer(output);
 
}
 
\ No newline at end of file
testdata/basic-modules/producer.pdl
Show inline comments
 
new file 100644
 
#module producer
 

	
 
primitive producer(out<u32> output) {
 
    sync {
 
        print("P: Going to send a value!");
 
        put(output, 1337);
 
        print("P: I just sent a value!");
 
    }
 
    print("P: I am exiting");
 
}
 
\ No newline at end of file
testdata/basic-modules/readme.txt
Show inline comments
 
new file 100644
 
Run as:
 

	
 
./bin-compiler -i ./testdata/basic-modules/consumer.pdl -i ./testdata/basic-modules/producer.pdl -i ./testdata/basic-modules/main.pdl
 
\ No newline at end of file
testdata/basic/readme.txt
Show inline comments
 
new file 100644
 
Run as:
 

	
 
./bin-compiler -i ./testdata/basic-modules/testing.pdl
 
\ No newline at end of file
testdata/basic/testing.pdl
Show inline comments
 
new file 100644
 
primitive consumer(in<u32> input) {
 
    sync {
 
        print("C: going to receive a value");
 
        auto v = get(input);
 
        print("C: I have received a value");
 
    }
 
    print("C: I am now exiting");
 
}
 

	
 
primitive producer(out<u32> output) {
 
    sync {
 
        print("P: Going to send a value!");
 
        put(output, 1337);
 
        print("P: I just sent a value!");
 
    }
 
    print("P: I am exiting");
 
}
 

	
 
composite main() {
 
    channel output -> input;
 
    new consumer(input);
 
    new producer(output);
 
}
 
\ No newline at end of file
testdata/eval/positive/1.pdl
Show inline comments
 
deleted file
testdata/eval/positive/1.txt
Show inline comments
 
deleted file
testdata/eval/positive/10.pdl
Show inline comments
 
deleted file
testdata/eval/positive/10.txt
Show inline comments
 
deleted file
testdata/eval/positive/11.pdl
Show inline comments
 
deleted file
testdata/eval/positive/11.txt
Show inline comments
 
deleted file
testdata/eval/positive/2.pdl
Show inline comments
 
deleted file
testdata/eval/positive/2.txt
Show inline comments
 
deleted file
testdata/eval/positive/3.pdl
Show inline comments
 
deleted file
testdata/eval/positive/3.txt
Show inline comments
 
deleted file
testdata/eval/positive/4.pdl
Show inline comments
 
deleted file
testdata/eval/positive/4.txt
Show inline comments
 
deleted file
testdata/eval/positive/5.pdl
Show inline comments
 
deleted file
testdata/eval/positive/5.txt
Show inline comments
 
deleted file
testdata/eval/positive/6.pdl
Show inline comments
 
deleted file
testdata/eval/positive/6.txt
Show inline comments
 
deleted file
testdata/eval/positive/7.pdl
Show inline comments
 
deleted file
testdata/eval/positive/7.txt
Show inline comments
 
deleted file
testdata/eval/positive/8.pdl
Show inline comments
 
deleted file
testdata/eval/positive/8.txt
Show inline comments
 
deleted file
testdata/eval/positive/9.pdl
Show inline comments
 
deleted file
testdata/eval/positive/9.txt
Show inline comments
 
deleted file
testdata/parser/counterexamples/arity_checking.pdl
Show inline comments
 
deleted file
testdata/parser/counterexamples/declaration_after_function_call.pdl
Show inline comments
 
deleted file
testdata/parser/counterexamples/definition_order.pdl
Show inline comments
 
deleted file
testdata/parser/counterexamples/empty_file_reporting.pdl
Show inline comments
 
deleted file
testdata/parser/counterexamples/function_type_checks.pdl
Show inline comments
 
deleted file
testdata/parser/counterexamples/import_bad_reporting.pdl
Show inline comments
 
deleted file
testdata/parser/counterexamples/import_stmt.pdl
Show inline comments
 
deleted file
testdata/parser/counterexamples/integer_specification.pdl
Show inline comments
 
deleted file
testdata/parser/counterexamples/multiple_versions.pdl
Show inline comments
 
deleted file
testdata/parser/counterexamples/out_of_order_assignment.pdl
Show inline comments
 
deleted file
testdata/parser/negative/1.pdl
Show inline comments
 
deleted file
testdata/parser/negative/1.txt
Show inline comments
 
deleted file
testdata/parser/negative/10.pdl
Show inline comments
 
deleted file
testdata/parser/negative/10.txt
Show inline comments
 
deleted file
testdata/parser/negative/12.pdl
Show inline comments
 
deleted file
testdata/parser/negative/12.txt
Show inline comments
 
deleted file
testdata/parser/negative/13.pdl
Show inline comments
 
deleted file
testdata/parser/negative/13.txt
Show inline comments
 
deleted file
testdata/parser/negative/14.pdl
Show inline comments
 
deleted file
testdata/parser/negative/14.txt
Show inline comments
 
deleted file
testdata/parser/negative/17.pdl
Show inline comments
 
deleted file
testdata/parser/negative/17.txt
Show inline comments
 
deleted file
testdata/parser/negative/18.pdl
Show inline comments
 
deleted file
testdata/parser/negative/18.txt
Show inline comments
 
deleted file
testdata/parser/negative/19.pdl
Show inline comments
 
deleted file
testdata/parser/negative/19.txt
Show inline comments
 
deleted file
testdata/parser/negative/2.pdl
Show inline comments
 
deleted file
testdata/parser/negative/2.txt
Show inline comments
 
deleted file
testdata/parser/negative/22.pdl
Show inline comments
 
deleted file
testdata/parser/negative/22.txt
Show inline comments
 
deleted file
testdata/parser/negative/23.pdl
Show inline comments
 
deleted file
testdata/parser/negative/23.txt
Show inline comments
 
deleted file
testdata/parser/negative/24.pdl
Show inline comments
 
deleted file
testdata/parser/negative/24.txt
Show inline comments
 
deleted file
testdata/parser/negative/25.pdl
Show inline comments
 
deleted file
testdata/parser/negative/25.txt
Show inline comments
 
deleted file
testdata/parser/negative/26.pdl
Show inline comments
 
deleted file
testdata/parser/negative/26.txt
Show inline comments
 
deleted file
testdata/parser/negative/27.pdl
Show inline comments
 
deleted file
testdata/parser/negative/27.txt
Show inline comments
 
deleted file
testdata/parser/negative/28.pdl
Show inline comments
 
deleted file
testdata/parser/negative/28.txt
Show inline comments
 
deleted file
testdata/parser/negative/29.pdl
Show inline comments
 
deleted file
testdata/parser/negative/29.txt
Show inline comments
 
deleted file
testdata/parser/negative/3.pdl
Show inline comments
 
deleted file
testdata/parser/negative/3.txt
Show inline comments
 
deleted file
testdata/parser/negative/30.pdl
Show inline comments
 
deleted file
testdata/parser/negative/30.txt
Show inline comments
 
deleted file
testdata/parser/negative/31.pdl
Show inline comments
 
deleted file
testdata/parser/negative/31.txt
Show inline comments
 
deleted file
testdata/parser/negative/32.pdl
Show inline comments
 
deleted file
testdata/parser/negative/32.txt
Show inline comments
 
deleted file
testdata/parser/negative/4.pdl
Show inline comments
 
deleted file
testdata/parser/negative/4.txt
Show inline comments
 
deleted file
testdata/parser/negative/5.pdl
Show inline comments
 
deleted file
testdata/parser/negative/5.txt
Show inline comments
 
deleted file
testdata/parser/negative/6.pdl
Show inline comments
 
deleted file
testdata/parser/negative/6.txt
Show inline comments
 
deleted file
testdata/parser/negative/7.pdl
Show inline comments
 
deleted file
testdata/parser/negative/7.txt
Show inline comments
 
deleted file
testdata/parser/negative/8.pdl
Show inline comments
 
deleted file
testdata/parser/negative/8.txt
Show inline comments
 
deleted file
testdata/parser/negative/9.pdl
Show inline comments
 
deleted file
testdata/parser/negative/9.txt
Show inline comments
 
deleted file
testdata/parser/positive/1.pdl
Show inline comments
 
deleted file
testdata/parser/positive/10.pdl
Show inline comments
 
deleted file
testdata/parser/positive/11.pdl
Show inline comments
 
deleted file
testdata/parser/positive/12.pdl
Show inline comments
 
deleted file
testdata/parser/positive/13.pdl
Show inline comments
 
deleted file
testdata/parser/positive/14.pdl
Show inline comments
 
deleted file
testdata/parser/positive/15.pdl
Show inline comments
 
deleted file
testdata/parser/positive/16.pdl
Show inline comments
 
deleted file
testdata/parser/positive/17.pdl
Show inline comments
 
deleted file
testdata/parser/positive/18.pdl
Show inline comments
 
deleted file
testdata/parser/positive/19.pdl
Show inline comments
 
deleted file
testdata/parser/positive/2.pdl
Show inline comments
 
deleted file
testdata/parser/positive/20.pdl
Show inline comments
 
deleted file
testdata/parser/positive/3.pdl
Show inline comments
 
deleted file
testdata/parser/positive/4.pdl
Show inline comments
 
deleted file
testdata/parser/positive/5.pdl
Show inline comments
 
deleted file
testdata/parser/positive/6.pdl
Show inline comments
 
deleted file
testdata/parser/positive/7.pdl
Show inline comments
 
deleted file
testdata/parser/positive/8.pdl
Show inline comments
 
deleted file
testdata/parser/positive/9.pdl
Show inline comments
 
deleted file
testdata/parser/positive/tarry.pdl
Show inline comments
 
deleted file
0 comments (0 inline, 0 general)