Colm is a programming language designed for the analysis and transformation of computer languages.
Colm is influenced primarily by TXL.
A transformation language has a type system based on formal languages.
Rather than defining classes or data structures, one defines grammars.
A parser is constructed automatically from the grammar, and the parser is used for two purposes:
In this setting, grammar-based parsing is critical because it guarantees that both the input and the structural patterns are parsed into trees from the same set of types, allowing comparison.
Colm is not-your-typical-scripting-language™:
This is how Colm is greeting the world (hello_world.lm
):
print "hello world\n"
Here's a Colm program implementing a little assignment language (assign.lm
) and its parse tree synthesis afterwards.
lex
token id / ('a' .. 'z' | 'A' .. 'Z' ) + /
token number / ( '0' .. '9' )+ /
literal `= `;
ignore / [ \t\n]+ /
end
def value
[id] | [number]
def assignment
[id `= value `;]
def assignment_list
[assignment assignment_list]
| [assignment]
| []
parse Simple: assignment_list[ stdin ]
if ( ! Simple ) {
print( "[error]\n" )
exit( 1 )
}
else {
for I:assignment in Simple {
print( $I.id, "->", $I.value, "\n" )
}
}
More real-world programs parsing several languages implemented in Colm can be found in the grammar/
-folder.
To immediatelly compile and run e.g. the hello_world.lm
program from above, call
$ colm -r hello_world.lm
hello world
Run colm --help
for help on further options.
$ colm --help
usage: colm [options] file
general:
-h, -H, -?, --help print this usage and exit
-v --version print version information and exit
-b <ident> use <ident> as name of C object encapulaing the program
-o <file> if -c given, write C parse object to <file>,
otherwise write binary to <file>
-p <file> write C parse object to <file>
-e <file> write C++ export header to <file>
-x <file> write C++ export code to <file>
-m <file> write C++ commit code to <file>
-a <file> additional code file to include in output program
-E N=V set a string value available in the program
-I <path> additional include path for the compiler
-i activate branchpoint information
-L <path> additional library path for the linker
-l activate logging
-r run output program and replace process
-c compile only (don't produce binary)
-V print dot format (graphiz)
-d print verbose debug information
To build Colm on your own, see the following dependencies and build instructions.
This package has no external dependencies, other than usual autotools and C/C++ compiler programs.
For the program:
For the documentation, install asciidoc
and fig2dev
as well.
Colm is built in the usual autotool way:
$ ./autogen.sh
$ ./configure
$ make
$ make install
The colm program depends on GCC at runtime. It produces a C program as output, then compiles and links it with a runtime library. The compiled program depends on the colm library.
To find the includes and the runtime library to pass to GCC, colm looks at
argv[0]
to decide if it is running out of the source tree. If it is, then the
compile and link flags are derived from argv[0]
. Otherwise, it uses the install
location (prefix) to construct the flags.
There is a vim syntax definition file colm.vim.
Colm is free software under the MIT license.
Please see the COPYING file for more details.