使用flex,lex,leex匹配严格的整个单词

时间:2017-10-31 10:11:28

标签: regex erlang leex

我刚刚开始使用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的限制,而不是来自这些*工具

0 个答案:

没有答案