根据输入中的长度和位置获取令牌
Getting tokens based on length and position inside input
在我的输入中,我有一个字符流,这些字符没有被任何定界符分隔,如下所示:
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
%%
但正如预期的那样,这不起作用:)
有什么方法可以解析这种按字符长度解析的输入吗?
您可以使用状态声明创建一个简单的解析器,并为每个规则分配一个状态。参考 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"
\lex
%%
在我的输入中,我有一个字符流,这些字符没有被任何定界符分隔,如下所示:
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
%%
但正如预期的那样,这不起作用:)
有什么方法可以解析这种按字符长度解析的输入吗?
您可以使用状态声明创建一个简单的解析器,并为每个规则分配一个状态。参考 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"
\lex %%