首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用BNFC定义INI文件语法?

如何使用BNFC定义INI文件语法?
EN

Stack Overflow用户
提问于 2009-06-25 06:39:24
回答 1查看 2.5K关注 0票数 7

http://www.cs.chalmers.se/Cs/Research/Language-technology/BNFC/

我应该如何编写标记的BNF来让BNFC为我生成INI解析器?

到目前为止我只得到了o__O!

代码语言:javascript
复制
entrypoints File ;

comment "#" ;

token ID ( letter | digit | ["-_'"] )+ ;

Ini. File ::= [Section] ;
Sect. Section ::= "[" ID "]" [Statement] ;
Bind. Statement ::= ID "=" ID ;

separator Statement "\n" ;
terminator Section "" ;

代码语言:javascript
复制
[name]
#x = 10
y = 20

代码语言:javascript
复制
Parse Successful!

[Abstract Syntax]

Ini [Sect (ID "name") [Bind (ID "y") (ID "20")]]

[Linearized tree]

[name]y = 20

代码语言:javascript
复制
[name]
x = 10
#y = 20

代码语言:javascript
复制
Parse Successful!

[Abstract Syntax]

Ini [Sect (ID "name") [Bind (ID "x") (ID "10")]]

[Linearized tree]

[name]x = 10

o__O我卡住了..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-25 11:20:02

我问了其中一位BNFC开发人员,并在这里引用了他的回答:

空间字符(如换行符)在令牌中不受很好的支持,因为BNFC具有硬连接的lexer类型" Space“。这个想法是,在“行为良好”的语言中,空格不能承载意义。其中一个限制使得BNFC如此简单..。但是您应该能够通过使用预处理器来解决这个问题,例如逐行解析输入。

例如:

代码语言:javascript
复制
entrypoints File ;

comment "#" ;

token ID ( letter | digit | ["-_'"] )+ ;

Ini. File ::= [Section] ;
Sect. Section ::= "[" ID "]" [Statement] ;
Bind. Statement ::= ID "=" ID ;

separator Statement "//" ;
terminator Section "//" ;

阅读:

代码语言:javascript
复制
[name]
x = 10
y = 20

预处理:

代码语言:javascript
复制
[name]//
x = 10//
y = 20//

解析:

代码语言:javascript
复制
Ini [Sect (ID "name") [Bind (ID "x") (ID "10"), Bind (ID "y") (ID "20")]]

转变:

代码语言:javascript
复制
                                          ↓                       ↓
Ini [Sect (ID "name") [Bind (ID "x") (ID "0"), Bind (ID "y") (ID "0")]]

写入:

代码语言:javascript
复制
[name]//
x = 0//
y = 0//

后处理:

代码语言:javascript
复制
[name]
x = 0
y = 0

(没有检查,不知道它是否有效,只是想给出一个主意!)

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

https://stackoverflow.com/questions/1042441

复制
相关文章

相似问题

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