【发布时间】:2018-09-20 19:32:56
【问题描述】:
好的,我现在已经尝试重写此 Bison 语法 3 次,并且一直遇到 shift/reduce 和 reduce/reduce 冲突。我试图解析的语法如下。 {...} 中的项目是一个或另一个。 [...] 中的项目是可选的。
CONSTANT constant-name constant-class
constant-class = { EQUALS expression numeric-options }
{ EQUALS STRING string string-options }
numeric-options = [ PREFIX prefix-string ]
[ TAG tag-string ]
[ COUNTER #local-name ]
[ TYPENAME type-name ] ;
string-options = [ PREFIX prefix-string ]
[ TAG tag-string ] ;
CONSTANT (constant-name,...) EQUALS expression
[ INCREMENT expression ]
[ PREFIX prefix-string ]
[ TAG tag-string ]
[ COUNTER #local-name ]
[ TYPENAME type-name ];
CONSTANT constant-name EQUALS expression,
.
.
.
;
CONSTANT (constant-name,...) EQUALS expression,
.
.
.
;
我在让最后三个全部工作时遇到问题。我可以让其中任何一个工作,但不是所有四个。我现在有一个班次/减少和一个减少/减少冲突。我的语法如下:
constant
: SDL_K_CONSTANT constant_style ';'
;
constant_style
: constant_name constant_class
| constant_list
| constant_set
;
constant_name
: sdl_name
;
constant_class
: SDL_K_EQUALS sdl_decimal
| SDL_K_EQUALS SDL_K_STRING sdl_string
;
constant_names
: constant_name
| constant_names ',' constant_name
| '(' constant_names ')'
;
names_equal
: constant_names SDL_K_EQUALS sdl_decimal
;
constant_list
: names_equal
;
constant_set
: names_equal
| constant_set ',' names_equal
;
我认为这些名称是自我记录的(至少您应该能够理解类型)。任何帮助将不胜感激。我有一种感觉,要么简化太多,要么不够简化。
注意:我想出了如何编辑我的帖子并删除了选项并将 SDL_K_COMMA 和 SDL_K_SEMI 分别更改为 ',' 和 ';'。
谢谢。
下面是一些应该解析的例子:
CONSTANT block_node_size EQUALS 24;
CONSTANT Strcon EQUALS STRING "This is a string constant" PREFIX Jg$
#block_size = 24;
CONSTANT block_node_size EQUALS #block_size;
CONSTANT
xyz EQUALS 10,
alpha EQUALS 0,
noname EQUALS 63;
CONSTANT
(zyx, nameless) EQUALS 10,
(beta) EQUALS 1,
gamma EQUALS 42;
CONSTANT (
bits,
bytes,
words,
longs,
quads,
octas
) EQUALS 0 INCREMENT 1 PREFIX ctx$;
CONSTANT
(bad_block,bad_data,,,,
overlay,rewrite) EQUALS 0 INCREMENT 4;
CONSTANT (pli,c,bliss,macro)
EQUALS 4 INCREMENT 4 PREFIX lang$
COUNTER #lang;
CONSTANT (basic,pascal,fortran)
EQUALS #lang + 4 INCREMENT 4 PREFIX lang$;
我希望这会有所帮助。
顺便说一句:这是 EBNF(有点):
/*
* Define the CONSTANT construct (Left out Expression).
*/
Str ::= "\"" Printable* "\""
Name ::= "$" | "_" | [A-Za-z] ("$" | "_" | [A-Z0-9a-z])*
Names ::= Name | ("(" Name ("," Name )* ")")
Constant_class ::= "EQUALS" (Expression Numeric_options | "STRING" Str
String_options)
String_options ::= Prefix? Tag?
Numeric_options ::= String_options Counter? Typename? Radix?
Increment_options ::= Increment? Numeric_options
Constant_list ::= Names "EQUALS" Expression Increment_options
Constant_set ::= Names Equals Expression
("," Names "EQUALS" Expression)*
Constant ::= "CONSTANT" (Name Constant_class | Constant_list |
Constant_set) ";"?
Prefix ::= "PREFIX" Str
Tag ::= "TAG" Str
Radix ::= "RADIX" ("DEC" | "OCT" | "HEX")
Counter ::= "COUNTER" Variable
Increment ::= "INCREMENT" Expression
Typename ::= "TYPENAME" Name
我想就是这样。
【问题讨论】:
-
顺便说一句:所有 *_options 和相关的语法都可以删除,但仍然可以证明问题(处理起来更简洁)。我应该删除它们。对不起。
-
您可以通过使用
','而不是SDK_K_COMMA(作为示例)使语法更具可读性(无论如何对我来说)。 -
很抱歉。我想出了如何编辑自己的帖子。
-
抱歉这么久才回复您。我希望它会有所帮助。 (出于好奇,您实际上要解析的语言是什么?您有参考吗?)
-
该语言称为结构定义语言 (SDL)。它是由 Digital Equipment Corporation 开发的,用于为多种编程语言生成程序定义。这是此link 的 CONSTANT 格式的链接(注意:文档中存在错误/歧义,但文档中的示例可能更清晰一些)。我将在下面为您的回复添加更多详细信息。
标签: bison shift-reduce-conflict reduce-reduce-conflict