]> git.sur5r.net Git - i3/i3/commit
Implement a new parser for commands. (+test)
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 14 Jan 2012 19:53:29 +0000 (19:53 +0000)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 14 Jan 2012 21:29:57 +0000 (21:29 +0000)
commita532f5ac392ba8c527fc8337bcf15a78ddb6aefa
tree7d0303bfedc99a680b602c09c6df1d768d6604ef
parentf81c89ac2866bf1fc53900536f5ca9fe8cf7ddc9
Implement a new parser for commands. (+test)

On the rationale of using a custom parser instead of a lex/yacc one, see this
quote from src/commands_parser.c:
     We use a hand-written parser instead of lex/yacc because our commands are
     easy for humans, not for computers. Thus, it’s quite hard to specify a
     context-free grammar for the commands. A PEG grammar would be easier, but
     there’s downsides to every PEG parser generator I have come accross so far.

     This parser is basically a state machine which looks for literals or strings
     and can push either on a stack. After identifying a literal or string, it
     will either transition to the current state, to a different state, or call a
     function (like cmd_move()).

     Special care has been taken that error messages are useful and the code is
     well testable (when compiled with -DTEST_PARSER it will output to stdout
     instead of actually calling any function).

During the migration phase (I plan to completely switch to this parser before
4.2 will be released), the new parser will parse every command you send to
i3 and save the resulting call stack. Then, the old parser will parse your
input and actually execute the commands. Afterwards, both call stacks will be
compared and any differences will be logged.

The new parser works with 100% of the test suite and produces identical call
stacks.
12 files changed:
Makefile
generate-command-parser.pl [new file with mode: 0755]
include/all.h
include/commands.h
include/commands_parser.h [new file with mode: 0644]
parser-specs/commands.spec [new file with mode: 0644]
parser-specs/highlighting.vim [new file with mode: 0644]
src/cmdparse.l
src/cmdparse.y
src/commands.c
src/commands_parser.c [new file with mode: 0644]
testcases/t/187-commands-parser.t [new file with mode: 0644]