我刚刚开始使用leex和yecc为一个非常简单的控件shell做lexer / parser的东西。
我的词法分析器定义:
Definitions.
COMMAND = STATUS|START|RELOAD|EXIT|STOP|RESTART
NAME = [a-z_][a-z_0-9]*
WHITESPACE = [\s\t\n\r]
Rules.
{COMMAND} : {token, {command, TokenLine, list_to_atom(TokenChars)}}.
{NAME} : {token, {name, TokenLine, TokenChars}}.
{WHITESPACE}+ : skip_token.
Erlang code.
真的没什么。简单案例工作正常:
iex(0)> :lexer.string('START')
{:ok, [{:command, 1, :START}], 1}
iex(1)> :lexer.string('START STOP')
{:ok, [{:command, 1, :START}, {:command, 1, :STOP}], 1}
iex(2)> :lexer.string('START foobar')
{:ok, [{:command, 1, :START}, {:name, 1, 'foobar'}], 1}
但这些一直困扰着我:
iex(3)> :lexer.string('STARTo')
{:ok, [{:command, 1, :START}, {:name, 1, 'o'}], 1}
相反,我想要类似的东西:
iex(3)> :lexer.string('STARTo')
{:ok, [{:illegal, 'STARTo'}], 1}
但我无法使用这些工具(使用 slim impl。for regex btw)来确定如何在字边界进行匹配
Ps:如果我知道这不是正确的方式,但只是想知道是否可能以及如何
修改 删除lex和flex标签,因为这似乎是leex的限制,而不是来自这些*工具