首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr4语法歧义

Antlr4语法歧义
EN

Stack Overflow用户
提问于 2013-08-01 22:49:57
回答 1查看 605关注 0票数 0

我有以下语法(将SO最小化)

代码语言:javascript
复制
grammar Hello;

odataIdentifier  : identifierLeadingCharacter identifierCharacter*; 


identifierLeadingCharacter : Alpha| UNDERSCORE;
identifierCharacter :  identifierLeadingCharacter | Digit;
identifierUnreserved    : identifierCharacter | (MINUS | DOT | TILDE);

Digit  : ZERO_TO_FIVE |[6-9];

ONEHUNDRED_TO_ONEHUNDREDNINETYNINE : '1' Digit Digit;            // 100-199
TWOHUNDRED_TO_TWOHUNDREDFOURTYNINE : '2' ZERO_TO_FOUR Digit;     // 200-249
TWOHUNDREDFIFTY_TO_TWOHUNDREDFIFTYFIVE : '25' ZERO_TO_FIVE;      // 250-255
TEN_TO_NINETYNINE : ONE_TO_NINE Digit;                           // 10-99

ZERO_TO_ONE : [0-1];
ZERO_TO_TWO : ZERO_TO_ONE | [2];
ZERO_TO_THREE : ZERO_TO_TWO | [3];
ZERO_TO_FOUR : ZERO_TO_THREE | [4];
ZERO_TO_FIVE : ZERO_TO_FOUR | [5];

ONE_TO_TWO  : [1-2];
ONE_TO_THREE  : ONE_TO_TWO | [3];
ONE_TO_FOUR  : ONE_TO_THREE | [4]; 
ONE_TO_NINE  : ONE_TO_FOUR | [5-9]; 

Alpha  : [a-zA-Z];

MINUS : [-];
DOT : '.';
UNDERSCORE : '_';
TILDE : '~';

WS  :  (' '|'\r'|'\t'|'\u000C'|'\n') -> skip
    ;

对于输入c9,它工作得很好,但是当我有2位数字(例如c10 )时,它会说:

代码语言:javascript
复制
extraneous input '92' expecting {<EOF>, Digit, Alpha, '_'}

所以我猜它解析了9,解析了2,不知道这应该是TEN_TO_NINETYNINE还是2 Digit Digit。我是这方面的新手,所以想知道我的分析是否正确,我怎样才能减轻这一切……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-01 23:15:13

您的输入将产生一个Alpha令牌和一个TEN_TO_NINETYNINE令牌。虽然解析器规则identifierLeadingCharacter确实允许Alpha令牌,但identifierCharacter规则不能匹配TEN_TO_NINETYNINE令牌。

输入10总是产生一个TEN_TO_NINETYNINE令牌,而不是两个Digit令牌,因为前者匹配更多的输入和Digit规则是贪婪的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18005972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档