2016-02-23 12 views
1

Я пытаюсь создать очень простой DSL, которая принимает строку, отформатированную какИмея проблемы с получением Yecc и Leex работать

GET /endpoint controller.action1 |> controller.action2 

И превратить его в нечто вдоль линий

{"GET", "/endpoint", [{controller.action1}, {controller.action2}]} 

Мой Leex файл состоит в следующем:

Definitions. 

Rules. 

GET|PUT|POST|DELETE|PATCH : {token, {method, TokenLine, TokenChars}}. 
/[A-Za-z_]+ : {token, {endpoint, TokenLine, TokenChars}}. 
[A-Za-z0-9_]+\.[A-Za-z0-9_]+ : {token, {function, TokenLine, splitControllerAction(TokenChars)}}. 
\|\> : {token, {pipe, TokenLine}}. 
[\s\t\n\r]+ : skip_token. 

Erlang code. 
splitControllerAction(A) -> 
    [Controller, Action] = string:tokens(A, "."), 
    {list_to_atom(Controller), list_to_atom(Action)}. 

И мой файл Yecc выглядит следующим образом:

Nonterminals route actionlist elem. 
Terminals function endpoint method pipe. 
Rootsymbol route. 

route -> method endpoint actionlist : {$1, $2, $3}. 

actionlist -> elem : [$1]. 
actionlist -> elem 'pipe' actionlist : [$1 | $3]. 

elem -> function : $1. 

Erlang code. 

extract_token({_Token, _Line, Value}) -> _Token; 

Выхода я получаю с этим:

2> {ok, Fart, _} = blah:string("GET /asdfdsf dasfadsf.adsfasdf |> adsfsdf.adsfdf"). 
{ok,[{method,1,"GET"}, 
    {endpoint,1,"/asdfdsf"}, 
    {function,1,{dasfadsf,adsfasdf}}, 
    {pipe,1}, 
    {function,1,{adsfsdf,adsfdf}}], 
    1} 
3> blah_parser:parse(Fart). 
{ok,{49,50,51}} 

ответ

1

Оказывается, вам нужно окружить $1 с одинарными кавычками, иначе он просто пытается и будет значение ASCII.

-Томас Геберт.