2

我刚刚开始使用 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

4

0 回答 0