我刚刚开始使用 leex 和 yecc 来为一个非常简单的控制外壳做词法分析器/解析器的东西。
我的词法分析器定义:
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}
但我不知道如何使用这些工具在单词边界进行匹配(它使用了一个苗条的impl。对于正则表达式 btw)
Ps:以防万一,我知道这不是正确的方法,但只是想知道是否可能以及如何
编辑 删除 lex 和 flex 标记,因为这似乎是 leex 的限制,而不是这些 *tools