racc で xvcd を生成することを試し始めた (その6)
ruby のracc を使って、xfy/xvcd を書きやすくすることの実験を続けています。
いままでは、EOL(改行)を 文の区切りとしていたが、
; を文の区切りとするようにシンタックスを変更しました。
この変更をした理由は、
foo(a,
b);
のように、パラメータ部を複数行の分けて書けるようにする為。
また、<xvcd:xvcd>, <xvcd:template> も関数として記述できるようにしました。
以下に 変更した文法と、それに沿った入力コードを示します。
(生成される xvcd は前回のものと変りはありません)
文法 (アクション部は省略)
===
rule
program : stmt_list
stmt_list :
| stmt_list stmt
| stmt_list SCOLstmt_block :
| LPA stmt_list RPAstmt : primary
| assign
| if_stmt
| while_stmt
| defun
| comment
| heredocif_stmt : IF string_cond THEN stmt_list elseif_cause else_cause END
elseif_cause :
| ELSEIF string_cond THEN stmt_list elseif_causeelse_cause :
| ELSE stmt_liststring_cond : STRING
defun : DEF IDENT param stmt_list END
param : '(' name_list ')'
| '(' ')'name_list : IDENT
| name_list ',' IDENTassign : IDENT '=' primary
primary : IDENT
| NUMBER
| STRING
| TRUE
| FALSE
| funcallfuncall : IDENT '(' args ')' stmt_block
| IDENT '(' ')' stmt_blockargs : primary
| args ',' primarycomment : COMMENT
heredoc : HEREDOC
end
入力コード例
===========
<<
// "Genereated using racc. 2007-06-09"
<<
xvcd(
"xmlns", "http://www.w3.org/1999/xhtml",
"xmlns:xvcd", "http://xmlns.xfy.com/xvcd",
"xmlns:instruction", "http://xmlns.xfy.com/instruction",
"xmlns:ctrl", "http://xmlns.xfy.com/controls",
"xmlns:event", "http://xmlns.xfy.com/event",
"xmlns:ui", "http://xmlns.xfy.com/ui",
"xmlns:command", "http://xmlns.xfy.com/command",
"xmlns:ab", "http://xmlns.example.com/developer/tutorial/addressbook",
"version", "1.0"
) {<<
//============== VOCABULARY ==========
vocabulary("name", "AddressBook",
"match", "ab:addressbook",
"call-template","Root") {
//============== MENU ==========
<< <ui:ui version="1.0">
<< <ui:main-menu>
<< <ui:menu label="Entry">
<< <ui:menu-item label="add" command="AddEntry" open-dialog="true" />
<< <ui:menu-item label="edit" command="EditEntry" open-dialog="true" />
<< </ui:menu>
<< </ui:main-menu>
<< </ui:ui>
};<<
//============== COMMAND ==========
def AddEntry(a, b)
dialog("return-to", "result") {
<< <ab:edit-dialog>
<< <ab:entry>
<< <ab:person />
<< <ab:address />
<< </ab:entry>
<< </ab:edit-dialog>
};if "'ok'=$result/ab:edit-dialog/@closed-by" then
insert("select","/ab:addressbook", "position","last-child") {
copy_of("select", "$result//ab:entry");
};
end
end<<
//============== TEMPLATE ==========
template("name", "EditDialogRoot") {
<< <html>
<< <body>
<< </body>
<< </html>
};
};
#--- End of File ---
今回の変更は、xfy/xvcd を短く書く為のものでは無いですね。
次回は、include の仕組みを導入したいです。
単なる include ではなく、共通利用できるコード断片を パラメータ置換しながら
取り込む様にする予定です。
最近のコメント