2015-05-15 3 views
-1

На моем входе у меня есть поток символов, не разделенных любым разделителем, например:Получение токенов на основе длины и позиции внутри входа

input = "150001" 

Я хочу сделать анализатор (используя JISON), который токенизировать в зависимости от позиции и длины, это должны быть мои жетоны:

15 - system id (first 2 numbers) 
0001 - order num (4 numbers after) 

можете ли вы дать мне несколько советов, как это можно сделать, я пытался добавить свои маркеры, как это:

%lex 
    %% 

    [0-9]{2} return "SYSTEM_ID" 
    [0-9]{4} return "ORDER_NUM" 

    \lex 
    %% 

Но, как ожидается, это не работает :)

Есть ли какой-нибудь способ, чтобы разобрать этот вид ресурсов, где вы разбором длиной символов?

ответ

1

Вы можете сделать простой синтаксический анализатор с использованием заявлений состояния и присвоить состояние каждому из этих правил. Ссылаясь на JISON-х documentation, это изменило бы что-то вроде этого (следует отметить, что ваш лексический еще не завершен, потому что он ничего не делает для идентификатора или «=»):

%lex 
%s system_id order_num 
%% 
/* some more logic is needed to accept identifier, then "=", each 
    with its own state, and beginning "system_id" state. 
    */ 
<system_id>[0-9]{2} this.begin("order_num"); return "SYSTEM_ID" 
<order_num>[0-9]{4} this.begin('INITIAL'); return "ORDER_NUM" 

\ ЛЕКС %%