我试图使用sablecc解析有效消息。有三种类型的有效消息格式。
{messageid} messageid semi ){flightnum} carriercode semi){load} hypene co semi )当我向程序输入有效字符串时,它没有工作。
投入:
abc;//类型1 ZZ;//类型2 ZZ;//类型2 -ab2;//类型3
sablecc语法代码:
Helpers
/* Our helpers */
fa = ['0' .. '9'] ;
a = [['a' .. 'z'] + ['A' .. 'Z']] ;
m= [a + fa];
sp = ' ' ;
cr = 13 ; // carriage return
lf = 10 ; // line feed
tab = 9 ; // tab char
bl = sp | cr | lf | tab;
Tokens
/* Our simple token definition(s). */
semi = ';' bl*;
co = (a)(m)(m);
messageid = (a)(a)(a) ;
carriercode = (m)(m);
hypene ='-';
Productions
program = {single} statement |
{sequence} program statement;
statement = {messageid} messageid semi |
{flightnum}carriercode semi |
{load} hypene co semi ;编译成功,当运行java代码时,它会抛出解析器异常:
simpleAdders.parser.ParserException: 1,1期待:消息发送,载波代码,'-‘
即使第一个字符串是有效的。
发布于 2015-07-24 06:52:28
此错误是由重叠令牌定义引起的。Sablecc是一种自下而上的树结构,不是一种顺序方式。这是解决问题的代码。谢谢艾蒂安把问题解决了。
Helpers
/* Our helpers */
sp = ' ' ;
cr = 13 ; // carriage return
lf = 10 ; // line feed
tab = 9 ; // tab char
bl = sp | cr | lf | tab;
Tokens
/* Our simple token definition(s). */
fa = ['0' .. '9'] ;
a = [['a' .. 'z'] + ['A' .. 'Z']] ;
semi = ';' bl*;
hypene ='-';
Productions
program = {single} statement |
{sequence} program statement;
m = {a} a | {fa} fa ;
co = hypene a [m1]:m [m2]:m semi;
messageid = [a1]:a [a2]:a [a3]:a semi ;
carriercode =[m1]:m [m2]:m semi;
statement = {messageid} messageid|
{flightnum}carriercode |
{load} co ;https://stackoverflow.com/questions/31530244
复制相似问题