pyboro是一个通过设置正则表达式表和构建语法映射来分析和使用输入的实用程序。
pyboro的Python项目详细描述
#什么是皮博罗?#
pyboro是一个用python构建的正则表达式lexer。
并且很容易使用这些信息扩展到构建自己的代码生成等。
是制作[Pyrex]玻璃器皿时使用的玻璃类型(http://en.wikipedia.org/wiki/Pyrex)。存储库最初称为pyrex,但这与pypi中已存在的同名包
相冲突。
从pyboro import consumer
lexer module
表。您将为每个希望能够解析的正则表达式创建"parseMap"对象。
这些设置方式如下:
my_parser=pyboro.lexer.parsemap((
("token name","regular expression",handler),
…
)
忽略,这个名字对功能来说是不敬的,
但对那些可能需要维护您的代码的人来说是好的。对于要保留的标记,标记名是访问匹配表达式的方式。其中parseMap搜索变量名和赋值:
print(result['variable name'])\prints'x'
print(result['assigment'])\prints'17'
"正则表达式"是与title.
"handler"是您创建的函数或parseMap常量。
如果使用处理程序的函数名,则必须将单个字符串作为参数,
并输出单个字符串。这允许您进一步转换或验证输入。注意,在python中,
基本类型也是函数。这样可以很容易地将输入字符串转换为整数,等等
("integer assignment",regex_foo,int)
,以便更深入地了解lexer,阅读[教程]("教程"。
consumer模块用于实际使用输入和返回结果表。
consumer对象需要一个参数一个parsemaps列表:
my_consumer=consumer.consumer([my_parser,my_other_parser,My_Third_Parser])
每当向该对象提供输入字符串时,它将在输入上迭代,并按顺序检查每个parseMaps。它将执行此操作,直到a)所有输入都被消耗(万岁!)
或b)找到语法错误(boo)。
my_consumer=consumer.consumer([电子邮件地址,姓名,favoriteColor])
results=none
open("input_file.txt")为f:
results=my_consumer.parse(f.read())如果无法干净地分析整个文件,则将引发错误
结果:
如果结果是电子邮件地址:
打印结果["address"]
help:如果发现错误,将显示的文本
格式化函数:接受输入、格式化并返回它的函数。
这将生成有用的错误消息,如:
"dafsdfdfdjkdljkj 12;"附近出现语法错误,应为有效类型。"
,其中"dafsdfdfdjkdljkj 12;"是格式化函数的输出,
"有效类型"是帮助消息。
<;a name="tutorial">;
您应该了解如何在python的're'模块中使用
正则表达式。如果您需要有关
这方面的帮助,请查看[官方文档](http://docs.python.org/library/re.html)。
接下来,您需要了解将要解析的内容。对于这个例子,
假设您想解析这一行:
int anumber=17;
这里有五件事:
+`int`:变量声明
+`anumber`:标识符
+`=`:运算符
+`17`:变量赋值
这些东西的正则表达式是什么?
+`int`
+文本"int"
+`[\t]+`
+至少一个空格或制表符
+`[\u a-za-z][\u a-za-z0-9]*`
+至少一个字符的字符串。它必须以下划线或字母开头,但后面可能有数字。
+`[\t]*`
+任意数量的空格或制表符
+`=`
+赋值运算符
+`[\t]*`
+任意数量的空格或制表符
+`[^;]+`
+至少有一个字符不是分号在一秒钟内)
+`[\t]*`
+任意数量的空格或制表符
+`;`
+分号。
我们允许在
赋值中使用任意数量的事物(分号除外)的原因是我们这里可能没有文字整数。例如,我们可以有一个函数调用,它返回一个整数。我们将在稍后处理
(在本例中不做此操作)。
,"int",lexer.parseMap.literal)、
("空白"、"[\t]+"、lexer.parseMap.ignore)、
("标识符"、"[\u a-za-z][u a-za-z0-9]*"、lexer.parseMap.literal)、
("空白"、"[\t]*",lexer.parseMap.ignore)、
("assignment-op"、"\="、lexer.parseMap.ignore)、
("assignment"、"[^;]+"、validate-u as-integer)、
("whitespace"、"[\t]*"、lexer.parseMap.ignore)、
("statement-end",";",lexer.parsemap.ignore)
)
````
我们给parsemap一个元组元组,每个元组都有以下内容:
1。对regex表示的内容的简短描述
2。正则表达式
3。告诉解析器如何处理找到的标记
让我们检查第三列:
1。` lexer.parsemap.literal`告诉parsemap按照声明的方式存储找到的数据。
2.` lexer.parsemap.ignore`将丢弃信息
3。` validate_as_integer`是一个可能我们已经编写过的函数,它接受
标记作为字符串,并返回一些将被存储的其他值。
然后我们可以像这样馈送解析器输入:
results=a_parser.parse(input_string)
"results"将是一个"ordereddict",其键是上面的描述,
,其值是已分析的值(或文字值)。因此,在这个
实例中,"results"看起来如下:
``python
results['type_declaration']='int'
results['identifier']='anumber'
results['assignment']=17
```
pyboro是一个用python构建的正则表达式lexer。
是制作[Pyrex]玻璃器皿时使用的玻璃类型(http://en.wikipedia.org/wiki/Pyrex)。存储库最初称为pyrex,但这与pypi中已存在的同名包
相冲突。
从pyboro import consumer
lexer module
这些设置方式如下:
my_parser=pyboro.lexer.parsemap((
("token name","regular expression",handler),
…
)
忽略,这个名字对功能来说是不敬的,
但对那些可能需要维护您的代码的人来说是好的。对于要保留的标记,标记名是访问匹配表达式的方式。其中parseMap搜索变量名和赋值:
print(result['assigment'])\prints'17'
"正则表达式"是与title.
"handler"是您创建的函数或parseMap常量。
如果使用处理程序的函数名,则必须将单个字符串作为参数,
并输出单个字符串。这允许您进一步转换或验证输入。注意,在python中,
基本类型也是函数。这样可以很容易地将输入字符串转换为整数,等等
("integer assignment",regex_foo,int)
,以便更深入地了解lexer,阅读[教程]("教程"。
consumer模块用于实际使用输入和返回结果表。
consumer对象需要一个参数一个parsemaps列表:
my_consumer=consumer.consumer([my_parser,my_other_parser,My_Third_Parser])
每当向该对象提供输入字符串时,它将在输入上迭代,并按顺序检查每个parseMaps。它将执行此操作,直到a)所有输入都被消耗(万岁!)
或b)找到语法错误(boo)。
my_consumer=consumer.consumer([电子邮件地址,姓名,favoriteColor])
results=none
open("input_file.txt")为f:
results=my_consumer.parse(f.read())如果无法干净地分析整个文件,则将引发错误
结果:
如果结果是电子邮件地址:
打印结果["address"]
help:如果发现错误,将显示的文本
格式化函数:接受输入、格式化并返回它的函数。
这将生成有用的错误消息,如:
"dafsdfdfdjkdljkj 12;"附近出现语法错误,应为有效类型。"
,其中"dafsdfdfdjkdljkj 12;"是格式化函数的输出,
"有效类型"是帮助消息。
<;a name="tutorial">;
您应该了解如何在python的're'模块中使用
正则表达式。如果您需要有关
这方面的帮助,请查看[官方文档](http://docs.python.org/library/re.html)。
接下来,您需要了解将要解析的内容。对于这个例子,
假设您想解析这一行:
int anumber=17;
这里有五件事:
+`int`:变量声明
+`anumber`:标识符
+`=`:运算符
+`17`:变量赋值
这些东西的正则表达式是什么?
+`int`
+文本"int"
+`[\t]+`
+至少一个空格或制表符
+`[\u a-za-z][\u a-za-z0-9]*`
+至少一个字符的字符串。它必须以下划线或字母开头,但后面可能有数字。
+`[\t]*`
+任意数量的空格或制表符
+`=`
+赋值运算符
+`[\t]*`
+任意数量的空格或制表符
+`[^;]+`
+至少有一个字符不是分号在一秒钟内)
+`[\t]*`
+任意数量的空格或制表符
+`;`
+分号。
我们允许在
赋值中使用任意数量的事物(分号除外)的原因是我们这里可能没有文字整数。例如,我们可以有一个函数调用,它返回一个整数。我们将在稍后处理
(在本例中不做此操作)。
,"int",lexer.parseMap.literal)、
("空白"、"[\t]+"、lexer.parseMap.ignore)、
("标识符"、"[\u a-za-z][u a-za-z0-9]*"、lexer.parseMap.literal)、
("空白"、"[\t]*",lexer.parseMap.ignore)、
("assignment-op"、"\="、lexer.parseMap.ignore)、
("assignment"、"[^;]+"、validate-u as-integer)、
("whitespace"、"[\t]*"、lexer.parseMap.ignore)、
("statement-end",";",lexer.parsemap.ignore)
)
````
我们给parsemap一个元组元组,每个元组都有以下内容:
1。对regex表示的内容的简短描述
2。正则表达式
3。告诉解析器如何处理找到的标记
让我们检查第三列:
1。` lexer.parsemap.literal`告诉parsemap按照声明的方式存储找到的数据。
2.` lexer.parsemap.ignore`将丢弃信息
3。` validate_as_integer`是一个可能我们已经编写过的函数,它接受
标记作为字符串,并返回一些将被存储的其他值。
然后我们可以像这样馈送解析器输入:
results=a_parser.parse(input_string)
"results"将是一个"ordereddict",其键是上面的描述,
,其值是已分析的值(或文字值)。因此,在这个
实例中,"results"看起来如下:
``python
results['type_declaration']='int'
results['identifier']='anumber'
results['assignment']=17
```