1. 程式人生 > >程式語言分析及其應用:Lisp格式到C格式的轉換及其計算

程式語言分析及其應用:Lisp格式到C格式的轉換及其計算

Lisp格式到C格式的轉換

  • Lisp的函式呼叫格式為: (函式名 引數1 引數2 … 引數n)
  • C的函式呼叫格式為:函式名(引數1, 引數2, …, 引數n)
  • 現有五個整數的二元函式add、sub、mul、div、mod和一些使用這些函式的Lisp格式表示式,請實現一個程式轉換器,將這些Lisp格式表示式轉成C格式的表示式,如下表。
    Lisp格式表示式轉成C格式的表示式的示例

首先考慮的是,需要將操作符(add等)和運算元(1,2…)得到。
先把表示式兩端無用括號去掉,然後以空格分隔成陣列,並且記錄(和)的個數來判斷當前是否為一個完整的運算元(可能是單獨的一個數或一個完整的表示式如 ( add 1 1 ))。

def
split_s(ss):
pass ''' add 1 1 => ["add", "1", "1"] add ( add 1 1 ) ( sub 1 5 ) => ["add", "( add 1 1 )", "( sub 1 5 )"] add ( add 1 1 ) ( sub 1 5 ) ( mul 1 2 3 ) => ["add", "( add 1 1 )", "( sub 1 5 )", "( mul 1 5 )"] '''

接下來只要遞迴處理獲得單個操作符和單個運算元即可。
沒錯就是遞迴。

# lisp 轉 c
def to_c(ss):
pass ''' add 1 2 => add(1,2) add ( add 1 1 ) ( sub 1 5 ) => add(add(1,1),sub(1,5)) add ( sub 4 2 ) ( div 2 3 ) ( mul 10 1 ) ( add 1 1 2 ) 1 => add(sub(4,2),div(2,3),mul(10,1),add(1,1,2),1) '''

Lisp格式表示式的型別檢測

  • Lisp的函式呼叫格式為: (函式名 引數1 引數2 … 引數n)
  • 現有兩個型別:整數int和布林型別bool,以及五個整數的二元函式add、sub、gt、lt、equ和三個布林值的函式and、or、not,其型別檢測規則如下:
    Lisp格式表示式的型別檢測規則
  • 請實現一個型別檢測器,並檢測這些Lisp格式表示式
    大致思路就是將“+-*”結果記為0,“/%”結果記為1,剩餘操作記為“T”表示bool型別。每次運算需先判斷是否型別匹配,且“/%”還需額外判斷除第一個數其餘數非0。判斷型別匹配用到了reduce處理。

這裡需要用到上述得到操作符和運算元的方法,然後將每個運算元做型別對映,比如可以把所有的int轉0,bool轉true等,然後依次累加啊處理啊,就可以了。注意的是還要關注除法和%操作第二個運算元不能為0,就搞定啦。可以考慮用py的map和reduce來簡化處理。

from functools import reduce


# 判斷是否為bool型別
def is_bool(ss):
    return ss in ["T", "F"]


# Lisp格式表示式的型別檢測
def check(ss):
    pass

Lisp格式表示式的計算

  • Lisp的函式呼叫格式為: (函式名 引數1 引數2 … 引數n)
  • 現有五個整數的二元函式add、sub、mul、div、mod,其語義計算規則如下
    Lisp格式表示式的計算
  • 請實現一個計算器,計算這些Lisp格式表示式

做完型別檢測,處理計算就容易多了,沒什麼問題。

# 表示式計算,需先進行check()型別檢測
def cal(ss):
    pass
'''
( add 1 2 ) => 3
( add ( add 1 1 ) ( sub 1 5 ) ) => -2
( add ( sub 4 2 ) ( div 2 3 ) ( mul 10 1 ) ( add 1 1 2 ) 1 ) => 23
( add ( sub 4 2 ) ( div 2 3 ) ( mul 10 1 ) ( add 1 e 2 ) 1 ) => e
'''

思想都擺在上邊,最後實現的是支援多個引數的轉換器和計算器。
pass有需要的可以自己YY填空,渡過安全期再補上,渡劫渡劫… =。=

實驗要求

相關推薦

程式語言分析及其應用:Lisp格式C格式轉換及其計算

Lisp格式到C格式的轉換 Lisp的函式呼叫格式為: (函式名 引數1 引數2 … 引數n) C的函式呼叫格式為:函式名(引數1, 引數2, …, 引數n) 現有五個整數的二元函式add、sub、mul、div、mod和一些使用這些函式的Lisp

程式語言的進化史,細數C/C++,Java等程式語言的演變

程式語言從何而來?程式設計師慣用的 Java、C、C++ 等語言又是誰研究而成的?本文追溯到 1800 年,歷數百年來的程式語言進化史。 在學習C/C++或者想要學習C/C++可以加入我們的學習交流QQ群:835257103,群內有學習資源,大家一起學習交流  1800

c語言入門將ASCII碼和字元相互轉換及其思考

#include<stdio.h> void main() { unsigned char a; printf("enter char:"); scanf("%C",& a ); printf("ascii = %d", a );//強制轉化為ascii碼 } 同理;

代寫ISSN留學生作業、代做Java/Python程式語言作業、代寫Python/c++程式作業

North American Actuarial JournalISSN: 1092-0277 (Print) 2325-0453 (Online) Journal homepage: http://www.tandfonline.com/loi/uaaj20Pricing Critical Illness

專訪李偉:這麼多程式語言,為什麼我選擇了C++?

C++是一門被廣泛使用的程式語言。在眾多的C++開發者中,大多數人用面向物件的方式編寫程式碼:我們日常接觸的C++專案基本上都是用這種風格組織的;幾乎每一本C++教程都會用絕大部分篇幅來討論面向物件;每位擁有數年C++開發經驗的程式設計師都會對面向物件有自己的見解。   面向物

十大程式語言特點及應用領域

計算機的發展,促使了一個新的職業的出現,程式設計師是近些年出現的並且得到了廣泛關注的一個職業,相信這也是很多莘莘學子的職業夢想。但程式設計師也有很多種,並不是每一個程式設計師能夠精通所有的程式語言。所謂術業有專攻,如果將來志在程式設計世界的網友就要注意了,今天西安卓新思創移

程式語言】在Unity3D中的C#程式設計初級

一、前言 這篇文章主要是給零基礎想要Unity入門的關於C#程式設計的一些意見 二、參考文章 三、正文 1、支援Unity3D的程式語言 C#、JavaScript、UnityScript 先說C#與JavaScript,因

邏輯式程式語言極簡實現(使用C#) - 1. 邏輯式程式語言介紹

相信很多朋友對於邏輯式程式語言,都有一種最熟悉的陌生人的感覺。一方面,平時在書籍、在資訊網站,偶爾能看到一些吹噓邏輯式程式設計的話語。但另一方面,也沒見過周圍有人真正用到它(除了SQL)。 遙記當時看《The Reasoned Schemer》(一本講邏輯式程式語言的小人書),被最後兩頁的直譯器實現驚豔到了

邏輯式程式語言極簡實現(使用C#) - 2. 一道邏輯題:誰是凶手

本系列前面的文章: * [邏輯式程式語言極簡實現(使用C#) - 1. 邏輯式程式語言介紹](https://www.cnblogs.com/skabyy/p/13199800.html) 這是一道Prolog經典的練習題,中文翻譯版來自阮一峰的文章[《Prolog 語言入門教程》](https://ww

邏輯式程式語言極簡實現(使用C#) - 4. 程式碼實現(完結)

本文是本系列的完結篇。本系列前面的文章: * [邏輯式程式語言極簡實現(使用C#) - 1. 邏輯式程式語言介紹](https://www.cnblogs.com/skabyy/p/13199800.html) * [邏輯式程式語言極簡實現(使用C#) - 2. 一道邏輯題:誰是凶手](https://ww

MySQL中毫秒值和日期的指定格式的相互轉換及其時間函式

DAYOFWEEK(date)  返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。這些索引值對應於ODBC標準。  mysql> select DAYOFWEEK('1998-02-03');  -> 3  WEEKDAY(date)  返回date的星期索引(0

C語言學習及應用筆記之二:C語言static關鍵字及其使用

static關鍵字 可能 語言 需要 c語言 UNC function 不必要 能夠   C語言有很多關鍵字,大多關鍵字使用起來是很明確的,但有一些關鍵字卻要相對復雜一些。我們這裏要說明的static關鍵字就是如此,它的功能很強大,相應的使用也就更復雜。   一般來說sta

C語言學習及應用筆記之四:C語言volatile關鍵字及其使用

  在C語言中,還有一個並不經常使用但卻非常有用的關鍵字volatile。那麼使用volatile關鍵字究竟能幹什麼呢?接下來我將就此問題進行討論。   一個使用volatile關鍵字定義變數,其實就是告訴編譯系統這變數可能會被意想不到地改變。那麼編譯時,編譯器就不會自作主張的去假設這個變數的值,而進行程式

線性表及其應用C語言實現(資料結構複習最全筆記)

一、順序表的表示與實現 1.線性表的順序結構定義 #define LIST_INIT_SIZE 100 //線性表儲存空間的初始分配量 #define LISTINCREMENT 10 //線性表儲存空間的分配增量 typedef struct { ElemType* el

C語言學習及應用筆記之五:C語言typedef關鍵字及其使用

緩沖區 delta 定義類 學習 語言 函數指針 alt ora 枚舉   在C語言中有一個typedef關鍵字,其用來定義用戶自定義類型。當然,並不是真的創造了一種數據類型,而是給已有的或者符合型的以及復雜的數據類型取一個我們自己更容易理解的別名。總之,可以使用typed

C語言學習及應用筆記之三:C語言const關鍵字及其使用

在C語言程式中,const關鍵字也是經常會用到的一個關鍵字,那麼使用const關鍵字的目的是什麼呢?事實上,在程式中使用const關鍵字的主要目的就是為了向使用者傳遞設計者的一些意圖。 事實上,無論我們是使用const關鍵字宣告變數還是宣告引數,其目的都是為了告訴使用者這個

C語言學習及應用筆記之六:C語言extern關鍵字及其使用

  在C語言中,修飾符extern用在變數或者函式的宣告前,用來以標識變數或者函式的定義在別的檔案中,提示編譯器遇到此變數或者函式時,在其它檔案中尋找其定義。extern關鍵字的用法有幾種,我們下面對其進行說明。 (1)extern修飾變數的宣告   extern關鍵字可以用來修飾變數,表示該變數在別的檔

關於C語言可變引數函式的寫法及其應用

以前一直以為C語言的函式都是精確匹配的,直到看了 C和C指標 才知道還有可變引數的函式。仔細一想,平時最常用的printf ,scanf 不就是可變引數的嗎。 先上程式碼,隨後詳細講解可變引數函式的用法。 #include<stdio.h> #inc

排序及其應用C語言實現(資料結構複習最全筆記)(期末複習最新版)

排序 關於排序給兩篇不錯的部落格參考: http://www.cnblogs.com/eniac12/p/5329396.html https://www.cnblogs.com/eniac12/p/5332117.html 知識前提 關於內外排序 內排序:指在排序

查詢及其應用C語言實現(資料結構複習最全筆記)

所謂查詢(Search)又稱檢索,就是在一個數據元素集合中尋找滿足某種條件的資料元素。查詢在計算機資料處理中是經常使用的操作。查詢演算法的效率高低直接關係到應用系統的效能。查詢的方法很多,本章將介紹一些常用的查詢演算法,主要有:線性表的查詢、樹表的查詢和散列表的查詢,並對有關的演算法進行效能分析