Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析技术,用于在解析过程中的任何时间点列出所有可用标记_Python_Parsing_Command Line Interface - Fatal编程技术网

Python 解析技术,用于在解析过程中的任何时间点列出所有可用标记

Python 解析技术,用于在解析过程中的任何时间点列出所有可用标记,python,parsing,command-line-interface,Python,Parsing,Command Line Interface,我想知道我是否可以使用CFG或PEG语法来表示CLI提示;例如,自动生成安装向导或测量。为了实现这一点,解析器必须根据用户已经输入的内容提示用户输入下一个输入标记。例如: customer_info -> "My name is " name_expression " and I'm " %age " years old." name_expression -> %name %name | %name name\u表达式允许您输入名字和姓氏,或者只

我想知道我是否可以使用CFG或PEG语法来表示CLI提示;例如,自动生成安装向导或测量。为了实现这一点,解析器必须根据用户已经输入的内容提示用户输入下一个输入标记。例如:

customer_info -> "My name is " name_expression " and I'm " %age " years old."
name_expression -> %name %name
                 | %name
name\u表达式
允许您输入名字和姓氏,或者只输入一个名字。提示将自动填充字符串常量。本规范将为假设用户编译以下示例体验:

My name is (enter %name):
>> john
My name is john (1 for "%lastname", 2 for " and I'm "):
>> 2
My name is john and I'm (enter a number):
>> 39
My name is john and I'm [39] years old.
Prompt complete, exiting.
我读过一小段关于“反向解析器”的文章,其思想是在一个交互式对话中,你所有的潜在反应都会在对话的每一步中列出(想想与NPC的RPG风格的视频游戏对话)。关于这项技术的信息在网上似乎很少,我不确定它是否能完全满足我的需要

我已经研究了Earley解析器、预测LL解析器和其他一些解析器,但是学习每一个候选解析器只是为了确定它是否适合这种情况似乎是不合理的。我的问题是,哪种解析技术最适合在输入语句不完整的情况下提示用户输入有效标记的列表

虽然我对递归下降解析和使用各种解析器生成器很熟悉,但我只研究了大约一年的材料,所以请原谅我的无知


谢谢。

任何从左到右的解析方案,只要能够使用该方案解析语言,只要不需要超过一个先行令牌,就可以正常工作。表驱动的实现可能更容易使用,前提是解析表是可访问和记录的(不幸的是,大多数解析器生成器都不是这种情况),但您可以使用任何具有“推送”接口和可复制状态的blackbox解析器,通过简单地循环所有可能的令牌类型并记录哪些不会产生错误


使用LL(1)语法比使用LR(1)语法更容易实现预测逻辑,因为LL解析器状态始终是唯一的项。LR解析器状态通常是多个项的并集,因此如何描述当前的解析上下文可能并不十分明显。另一方面,LR解析器可以处理更大的语法集。

这种技术已经存在于中,我认为它内置于ANTLR和Bison/Yacc生成的解析器中。当输入中遇到错误时,它将被激活。然后列出所有预期的有效令牌

有些人称之为自动完成或句子完成。它很少用于您询问的目的。但是,使用修改后的解析器是可行的。解析器必须生成问题“我的名字是”,然后从用户那里读取预期的标记“”

它实际上简化了解析器的功能。对这种简单的东西使用LR解析器是过分的

语法可能如下所示:

Goal      -> Questions <eof>
Questions -> FirstName LastName Street City State Zipcode Age
FirstName -> first name <first_name>
LastName  -> last name <last_name>
Street    -> street <street>
City      -> city <city>
State     -> state <state>
Zipcode   -> zipcode <zipcode>
Age       -> age <age> 
目标->问题
问题->名字姓氏街道城市州Zipcode时代
名字->名字
姓氏->姓氏
街道->街道
城市->城市
状态->状态
Zipcode->Zipcode

Age->Age可以生成一个CLR(1)解析器,该解析器已经内置了代码来列出期望的令牌

答案很有帮助,但我认为LR(或LL)并不过分。解析的全部范围在这里发挥作用,特别是在递归问卷中。例如,在清单设置向导中,您必须添加任意数量的项目,并且根据项目的类型,您可能会有不同的后续问题。如果可以避免使用多个派生(例如,
item->name | string_literal
)生成,那么这样的解析器就很简单了。但正是条形运算符
|
回避了“我如何走上正确的道路?”和“哪种解析技术可以提供最佳解决方案?”的问题。我应该补充一点,只有当非终结符包含其他非终结符时,具有多个产物的非终结符才是棘手的。我上面的例子很容易解决,
item->name | string_lit
。。。但是如果它是
item->name item\u details | name item\u表达式
,该怎么办呢。
item\u details
item\u expression
包含的内容可以是任意的,甚至可以有一个公共前缀。弄清楚如何解决这个问题是我真正陷入困境的地方,我想也许有人以前解决过这个问题?这是在解析器生成器创建的状态机中自动解决的。