首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR4在输入时没有可行的替代方案

ANTLR4在输入时没有可行的替代方案
EN

Stack Overflow用户
提问于 2019-07-04 16:38:16
回答 1查看 290关注 0票数 0

我正在用PseudoCode实现一种简单的ANTLR4语言,这是我当前的语法:

代码语言:javascript
复制
// Define a grammar called PseudoCode
grammar PseudoCode;
prog : FUNCTION SIGNATURE '(' ')'
        | FUNCTION SIGNATURE '{' VARB '}' ;

param: VARB | VARB ',' param ;

assignment: VARB '=' NUMBER ;

FUNCTION: 'function' ;
VARB: [a-z0-9]+ ;
SIGNATURE: [a-zA-Z0-9]+ ;
NUMBER: [0-9]+ | [0-9]+ '.' [0-9]+ ;

WS: [ \t\r\n]+ -> skip ;

问题是在编译和生成Parser、Lexer等.然后使用grun PseudoCode prog -tree运行,输入为:function bla{bleh}

我继续得到以下错误:

代码语言:javascript
复制
line 1:9 no viable alternative at input 'functionbla'

有人能指出我的语法出了什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-04 16:49:46

blaVARB,而不是SIGNATURE,因为它匹配规则,而VARB在语法中居第一位。按照定义lexer规则的方式,只有在标识符包含大写字母时才能将标识符匹配为SIGNATURE

解决此问题的最简单方法是为标识符设置一个单一的lexer规则,然后在当前使用SIGNATUREVARB的任何地方使用该规则。如果要在某些地方不允许大写字母,只需在操作或侦听器中检查此条件,这还允许您生成比语法错误更清晰的错误消息(例如,“变量名称中不允许大写字母”)。

如果您确实需要变量名称中的大写字母为语法错误,则可以为带有大写字母的标识符定义一条规则,而不使用大写字母的规则。然后,您可以在只允许小写字母的地方使用ID_WITH_CAPITALS | ID_LOWER_CASE_ONLY,在只允许小写字母的情况下使用ID_LOWER_CASE_ONLY

PS:您还需要确保标识符规则与数字不匹配( VARBSIGNATURE目前都这样做)。目前,只有小数点的数字才会生成NUMBER标记。

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

https://stackoverflow.com/questions/56891788

复制
相关文章

相似问题

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