"Head First:Design Patterns"一书中的Decorator Pattern用例让我有了这个问题.我会试着写下来:
这是一个咖啡店系统,有一些咖啡和许多调味品可以放入其中(需要额外付费),你需要能够订购和收取客户所需的任何调味品的咖啡,并避免完全混乱(例如,用于跟踪调味品的布尔值)使用装饰器图案.我们有一个抽象的Beverage类,每种类型的咖啡作为混凝土组件,每种调味品都作为包装Beverage的混凝土装饰器,如下所示:
所以我们有以下过程返回咖啡费用:
我的问题是:为什么不用列表而不是装饰器来实现它?我们可以在每个饮料中有一份调味品清单,并通过迭代列表来计算成本.要订购咖啡,我们只需要实例化一次并添加所需的调味品,避免声明如下:
// Using second image example
Beverage beverage = new DarkRoast(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
Run Code Online (Sandbox Code Playgroud)
除此之外,我们将有更多的灵活性来进行操作,比如给咖啡打折,不包括它的调味品,一旦我们没有装饰员包装咖啡.这是一个长期研究过的问题,我知道我错过了一些东西或者说我错了,所以如果你对此有任何想法,我很想知道并进一步讨论.
因此,我正在为C创建编译器,而我目前正在创建文字,变量和函数表。
这条规则使我减少/减少冲突:
lval: ID { check_var(); }
| ID { check_var(); } LBRACK NUM RBRACK
| ID { check_var(); } LBRACK ID { check_var(); } RBRACK;
Run Code Online (Sandbox Code Playgroud)
错误如下:
parser.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
parser.y:104.6-21: warning: rule useless in parser due to conflicts [-Wother]
| ID { check_var(); } LBRACK ID { check_var(); } RBRACK;
^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
我有优先规则,可以避免减少令牌上的错误,但是现在它指向的是非令牌,所以不确定我应该怎么做?
如果有任何帮助,这些是我的优先规则:
%token INPUT OUTPUT WRITE
%token RETURN VOID IF ELSE WHILE ASSIGN SEMI COMMA
%token LPAREN RPAREN LBRACE RBRACE LBRACK RBRACK
%token NUM ID …Run Code Online (Sandbox Code Playgroud)