Make your own compiler, interpreter, parser, or expression analyzer
Other FPC parser packages
fcl-xml is a FPC package that contains SAX XML and html parsers.
FPC also contains two expression parsers symbolic and TFPExpressionParser.
Lex and Yacc
Two of the oldest unix tools. Lex is a lexical analyser (token parser), and Yacc is a LALR parser generator. BNF notation is used as a formal way to express context free grammars. Code and grammar are mixed, so grammar is tied to implementation language.
Plex and Pyacc
Plex and Pyacc are pascal implementations of Lex and Yacc and they are part of your FreePascal distribution.
Lazarus Lex and Yacc
You can find unfortunately abandoned Lazarus Lex and Yacc here.
Gold is a free parsing system that you can use to develop your own programming languages, scripting languages and interpreters. It uses LALR parsing, and a mix of BNF notation, character sets and regular expressions for terminals to define language grammars. Code and grammar are separated, so grammar is not tied to implementation language. This means that the same grammar can be loaded into engines made in different programming languages.
Gold Parser Builder can be used to create, modify and test languages in Windows IDE which can also run on Wine. Command line tools are also available.
Gold Parser Builder can also be used as a parser code generator using internal templates (FreePascal included), but there are also 3rd party engines to process compiled grammars.
Gold Parser Builder has grammar editor with syntax highlighting, grammar generating wizard, test window to step through parsing of a sample source, templating system that can generate lexers/parsers or skeleton programs for various languages (including Delphi and FreePascal), import/export YACC/Bison, XML and HTML export, and interactive inspection of the compiled DFA and LALR tables.
SynFacilSyn is Lazarus cross-platform library that includes a SynEdit highlighter that also can work as a lexer because of its flexible syntax definition file. It's well documented and has been used in several projects like highlighter and lexer.
SynFacilSyn includes an adapter to be used in ATSynEdit.
The main advantage of using SynFacilSyn as lexer is that you can really see the tokens colored in SynEdit editor, without doing anything else. So if you define a lexer, you are defining a source highlighter too.
To define the syntax you can use an XML file, where the tokens are defined using tags and some RegEx constructions. There you can specify the token colors too, if you need it.
Syntax definition can be done programmatically too, so it's possible to change some syntax elements in runtime.
The highlighter of SynFacilSyn is light, fast and includes some useful methods to access the text content after the scan. Moreover includes some features to define recursive blocks ans sections so it can be used as a parser too.
SynFacilSyn is the base library for other tools that in group can be used to create powerful compilers/interpreters/IDE:
- SynFacilCompletion - Scriptable Highlighter with code-completion for the SynEdit Component of Lazarus
- SynFacilUtils Library with utilities to create editors using SynFacilSyn and SynFacilCompletion.
- t-Xpres Framework to create compilers/interpreters based on SynFacilSyn. Includes lexer, parser, syntaxTree, expression evaluator and support to implement code generators or virtual machines.
The next programs have been created using this tools:
Anatomy of a compiler
Here is graphical representation of a typical compiler anatomy:
Useful BNF and EBNF tools
- BNF and EBNF metasyntax formal notations for writing grammars
- EBNF to Syntax Diagram online convertor
- EBNF Visualizer
- Syngen - tool for generating syntax diagrams from BNF in LaTeX format
- Compiler construction, by Niklaus Wirth.
- Let's build a compiler, by Jack Crenshaw; original site, PDF version, or updated version.
- Compiler Basics (August 1995), by James Alan Farrell
- Writing an interpreter
- Notations for context-free grammars
- Parsing Techniques - A Practical Guide (1st ed., 1990), by Dick Grune and Ceriel J.H. Jacobs