-
Notifications
You must be signed in to change notification settings - Fork 0
A ECMAScript (JavaScript) based lex implementation
License
GPL-3.0, LGPL-3.0 licenses found
Licenses found
GPL-3.0
LICENSE.GPL
LGPL-3.0
LICENSE.LGPL
d11wtq/lx
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Lx is a lex implementation in ECMAScript (including JavaScript) --------------------------------------------------------------- Lx was developed as a dependency for another project which needs to deal with source code and grammar rules. Lx by itself implements just about the same features as Lex/Flex, though the naming is consistently different and the routine uses an object-oriented approach. Lx is able to recognize the lower level structures in programming source codes of most languages. It uses basic string matching and regular expressions to scan its input, performing user- specified actions as it matches each structure, usually referred to as a "terminal symbol" or "token". Reading the Flex info page will almost certainly help you understand the API which Lx uses. A companion library is in development by the same author which provides the parsing abilities of Yacc, recognising higher level structures (nonterminal symbols) and interpreting the input from Lx as it scans using a LALR(1) routine (scanning with a lookahead symbol). IMPORTANT: Lx is pre-1.0, it has NOT been optimized in true TDD fashion, but it will be optimized once the missing features* have been implemented. Testing ------- You may wish to run the unit tests provided before you get started. The unit tests for Lx are written in the ECMAUnit framework and can be run via an Ant script (if you have a Java Runtime installed, along with the Ant software). ant -f ant-runtests.xml test-all Alternatively they can be run inside your web browser by opening the HTML file tests/unit/AllTests.html. Naming Differences from Flex/Lex -------------------------------- Though Lx follows the same API as Flex, it does not use exactly the same names. Rather than being prefixed "yy", all properties and routines are members of a global object called Lx. Moreso, with the exception of lex() and wrap(), all routines and are named with CamelCase, including an uppercase first letter. Token names and state names are traditionally written all in UPPERCASE. Equivalents: ----------- FILE *yyin String Lx.In FILE *yyout String Lx.Out char *yytext String Lx.Text int yylineno Integer Lx.LineNo int yyleng Integer Lx.Leng int yylval Object Lx.Lval int *START Integer Lx.START int INITIAL Integer Lx.INITIAL void ECHO void Lx.Echo() void yymore() void Lx.More() void yyless(n) void Lx.Less(n) void unput(c) void Lx.Unput(c) char input() String Lx.Input() void yy_push_state(s) void Lx.PushState(s) void yy_pop_state() void Lx.PopState() int yy_top_state() Integer Lx.TopState() void BEGIN cond void Lx.Begin(s) void REJECT void Lx.Reject() void terminate() void Lx.Terminate() int yylex() Integer Lx.lex() int yywrap() Boolean Lx.wrap() The global object Lx always points to the currently scanning analyzer. * Missing Features (Regardless of the above list): -------------------------------------------------- - Lx.Reject() - Lx.Restart() - Lx.Terminate() - Inclusive states - Line number tracking (may never be added - easily achieved manually)
About
A ECMAScript (JavaScript) based lex implementation
Resources
License
GPL-3.0, LGPL-3.0 licenses found
Licenses found
GPL-3.0
LICENSE.GPL
LGPL-3.0
LICENSE.LGPL
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published