首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr grun错误-没有可行的替代输入

Antlr grun错误-没有可行的替代输入
EN

Stack Overflow用户
提问于 2021-12-13 19:50:32
回答 1查看 94关注 0票数 1

我正试图为Prolog解释器编写语法。当我像“父亲(约翰,玛丽)”这样的输入从命令行运行grun时,我会收到一条消息:“在‘父亲’(john,john)没有可行的输入”,我不知道为什么。我试过在语法中重新排列规则,使用不同的入口点等,但仍然会出现同样的错误。我甚至不确定它是由我的语法引起的,还是其他类似于antlr本身的原因。有人能指出我的语法出了什么问题吗?或者想一想,如果不是语法,可能是什么原因?

我运行的命令是:

antlr4 -no-listener -visitor Expr.g4

javac *.java

grun antlr.Expr start tests/test.txt -gui

这是生成的解析树:

这是我的语法:

代码语言:javascript
复制
grammar Expr;

@header{
    package antlr;
}

//start rule
start       : (program | query) EOF
            ;
            
program     : (rule_ '.')*
            ;

query       : conjunction '?'
            ;

rule_       : compound
            | compound ':-' conjunction
            ;

conjunction : compound
            | compound ',' conjunction
            ;
            
compound    : Atom '(' elements ')'         
            | '.(' elements ')'             
            ;

list        : '[]'
            | '[' element ']'           
            | '[' elements ']'          
            ;
            
element     : Term
            | list
            | compound
            ;           

elements    : element
            | element ',' elements
            ;
            
WS          : [ \t\r\n]+ -> skip ;

Atom        : [a-z]([a-z]|[A-Z]|[0-9]|'_')*
            | '0' 
            ;

Var         : [A-Z]([a-z]|[A-Z]|[0-9]|'_')*
            ;

Term        : Atom
            | Var
            ;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-13 20:12:28

lexer将始终为任何输入生成相同的标记。lexer不“侦听”解析器试图匹配的内容。lexer应用的规则非常简单:

  1. 试图匹配尽可能多的字符,当2个或更多的词条规则匹配相同数量的字符时,让规则首先定义为"win"

由于第二条规则,规则Term将永远不会被匹配。将Term规则移至VarAtom之上将导致后一条规则永远不匹配。解决方案:将Term规则“促进”为解析器规则:

代码语言:javascript
复制
start       : (program | query) EOF
            ;

program     : (rule_ '.')*
            ;

query       : conjunction '?'
            ;

rule_       : compound (':-' conjunction)?
            ;

conjunction : compound (',' conjunction)?
            ;

compound    : Atom '(' elements ')'
            | '.' '(' elements ')'
            ;

list        : '[' elements? ']'
            ;

element     : term
            | list
            | compound
            ;

elements    : element (',' element)*
            ;

term        : Atom
            | Var
            ;

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

Atom        : [a-z] [a-zA-Z0-9_]*
            | '0'
            ;

Var         : [A-Z] [a-zA-Z0-9_]*
            ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70340190

复制
相关文章

相似问题

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