忍者ブログ

EDA Blog

Verilog、SystemVerilog、SystemCなど、ハードウェア記述言語についてのブログです。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コンパイラ構成法: 第7章

コンパイラ構成法の第7章のサンプルプログラム一式を入力して実行したところ、またもや「問題が発生したため、ExprC.exeを終了します」のメッセージが。

ソースコードを見直しても明らかな間違いが見つからず、あきらめて第8章に進もうとしたが、このページを参考にgdbを使ってみたところ、
SymTab[Last + 1]
と記述するべきところで、初期化していない変数iを使って
SymTab[Last + i]
と記述してしまっていたことが原因とすぐ分かった。
gdbに感謝!

拍手[0回]

PR

コンパイラ構成法: 一個以上の表し方

一個以上(正規表現だと+)のあらわし方。
下記の記述の場合、s_listは一個以上のstmtからなることを示している。

s_list : stmt
       | s_list stmt
       ;

拍手[0回]

コンパイラ構成法: VSM

コンパイラ構成法の第6章にある仮想スタックマシンVSMのコードを入力。
コンパイルして実行してみたが、「問題が発生したためCalcL.exeを終了します」になってしまう。
VSM.cのどこかで間違っている模様。
明日デバッグする。

(1/26追記)
CalcL.lのscanfで、
sscanf(yytext, "%d", &yylval);
とすべきところで、yylvalの前の&が抜けていたことが原因だった。
VSM.cには特にエラーはなく、すぐに動作した。

拍手[1回]

コンパイラ構成法:演習問題2-2 (b) 続き

先日は空のリスト () には対応できていなかったが、対応できた。
演習問題 2-2(b)にあるリストでは、すべて correct expression として受理される。
0個以上というのを文法ではこのように記載することに気が付いたことが大きい。
%token CHAR

%%

input : '(' expr ')' '\n' { printf("correct expression\n"); } ;
expr :                    { printf("[empty] -> expr\n"); } 
     | expr term          { printf("expr -> expr term\n"); };
term : CHAR               { printf("term -> CHAR(%c)\n", $1); }
     | '(' expr ')'       { printf("term -> ( expr )\n"); }
     ;

%%

yylex() {
	int c;

	while (' ' == (c = getchar()) );
	if ( isalpha(c) ) {
		yylval = c;
		return CHAR;
	} else {
		return c;
	}
}

拍手[0回]

コンパイラ構成法: 任意個の式の繰り返し

行 → { 式 \n }
という文法を表現する場合、行をline、式をexprとして次のように表現できる。
line : /* 空規則 */
     | line expr '\n'


拍手[0回]

コンパイラ構成法: 第4章まで

コンパイラ構成法は第4章まで読み進んだ。
第2章~第4章の演習問題も後でできるだけ自分で解いてみたい。
第5章は「字句解析のLex」。

拍手[0回]

コンパイラ構成法:演習問題2-2 (b)

コンパイラ構成法の演習問題2-2(b)。
空のリスト ( ) はまだ対応できていないが、(a)、(a b c)、((a b) c)、(a ((b) c (d e))は対応できたはず。
リストの要素は、文字1つに限定している。
%token CHAR

%%

input : '(' expr ')' '\n' { printf("correct expression\n"); } ;
expr : expr term          { printf("expr + term -> expr\n"); } 
     | term               { printf("term -> expr\n"); };
term : CHAR               { printf("CHAR (%c) -> term\n", $1); }
     | '(' ')'            { printf("(empty list) -> term\n"); }
     | '(' expr ')'       { printf("( expr ) -> term\n"); } ;

%%

yylex() {
	int c;

	while (' ' == (c = getchar()) );
	if ( isalpha(c) ) {
		yylval = c;
		return CHAR;
	} else {
		return c;
	}
}

拍手[0回]

言語実装パターン: 1/15の週

言語実装パターンは、今週は第6章から第8章まで読み進める予定です。
書籍自体は、2月いっぱいで読み終えようと考えています。
次は、数年前に買って一度は1/3くらい読んで挫折した、コンパイラ構成法に移る予定です。
こちらの本はlex/yaccを使っていますが、仮想的なマシンをターゲットに、少しずつC言語のような文法を定義していくという内容です。

拍手[0回]

言語実装パターン再開

ANTLRのチュートリアルを一通り読んだので、言語実装パターンを再開しました。
はじめから、必要に応じてメモを取りながら読み進んだところ、前回つまずいたところも理解できました。
サンプルコードはあまり試していませんが、パターン 12: 組み込み非均質木走査器まで進みました。

拍手[0回]

ANTLRチュートリアル

ANTLRのチュートリアルを7. Simple Lexer/Parser Exampleまで進めた。
これを一通りこなしてから言語実装パターンに戻ろうと思う。

拍手[0回]

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

フリーエリア

最新CM

[04/11 なつたん]

最新TB

プロフィール

HN:
aston_martin
性別:
非公開

ブログ内検索

カウンター

アクセス解析