⑴ 用編譯原理的思想寫一個計算器,語言不限。有人會嗎。
這既要語言表達能力強,又要懂得集成電路軟體開發的技術才能完成,等著吧,好人會出現的,我也想看看別人怎麼寫
⑵ vs2010編譯簡單計算器窗體
先看看圖片 說明以上控制項動態生成的,初學可自己拖放控制項,以下代碼僅供參考 /*設計一個簡單的四則計算器*/ string[]名稱={"+","-","*","/"}; Button[]控制項組=Array.ConvertAll(名稱,控制項=>newButton()); EventHandler[]按鈕事件=newEventHandler[]{按鈕加_Click,按鈕減_Click,按鈕乘_Click,按鈕除_Click}; foreach(Button按鈕in控制項組) { 按鈕.Text=名稱[--數]; 按鈕.Name="按鈕"+數.ToString(); 按鈕.Parent=this; 按鈕.Anchor=(AnchorStyles.Top|AnchorStyles.Left); 按鈕.Location=newPoint(100*數,17); 按鈕.Click+=按鈕事件[數]; } 名稱=newstring[]{"值1","值2","結果"}; TextBox[]數字輸入框=Array.ConvertAll(名稱,控制項=>newTextBox()); 數=3; foreach(TextBox輸入框in數字輸入框) { 輸入框.Text=(--數+10).ToString(); 輸入框.Name="輸入框"+名稱[數]; 輸入框.Parent=this; 輸入框.Anchor=(AnchorStyles.Top|AnchorStyles.Left); 輸入框.Location=newPoint(100*數,0); } void按鈕加_Click(objectsender,EventArgse) { 四則運算("+"); } void按鈕減_Click(objectsender,EventArgse) { 四則運算("-"); } void按鈕乘_Click(objectsender,EventArgse) { 四則運算("*"); } void按鈕除_Click(objectsender,EventArgse) { 四則運算("/"); } void四則運算(string運算符) { Control.ControlCollection文本框=this.Controls; double值1=int.Parse(文本框[9].Text),值2=int.Parse(文本框[8].Text); switch(運算符) { case"+": {文本框[7].Text=(值1+值2).ToString();} break; case"-": {文本框[7].Text=(值1-值2).ToString();} break; case"*": {文本框[7].Text=(值1*值2).ToString();} break; case"/": {文本框[7].Text=(值1/值2).ToString();} break; default: break; } }
⑶ 用匯編語言編譯簡易計算器
用匯編語言太難了,如果用C51就會容易得多,
⑷ 求java編的簡易計算器,急急急
//發到你郵箱了,我是用QQ郵箱發的,815611030的那個。以下是我的源代碼
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class Stack
{
String s[]=new String[100];
int n=0;
public void InQuece(String str)
{
s[n]=str;
n++;
}
public String DeQuece()
{
return s[--n];
}
public String Front()
{
return s[n-1];
}
public void Sprint()
{
for(int i=n-1;i>=0;i--)
System.out.print(s[i]+" ");
System.out.println();
}
}
public class Calculator
{
static Frame frm=new Frame("Calculator");
//static TextField tff=new TextField(20);
static Label lab=new Label("0.");
static Panel pan=new Panel();
static String labelstr="";
static String ltemp="";
static int flag=1;
static Button b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19;
public void setFrame()
{
frm.setBounds(300,150,400,350);
frm.setLayout(null);
frm.addWindowListener(new window());
frm.setVisible(true);
b0=new Button("0");b1=new Button("1");b2=new Button("2");b3=new Button("3");b4=new Button("4");b5=new Button("5");b6=new Button("6");
b7=new Button("7");b8=new Button("8");b9=new Button("9");
b10=new Button("+");b11=new Button("-");b12=new Button("*");b13=new Button("/");b14=new Button("AC");b15=new Button("C");b16=new Button("=");
b17=new Button("(");b18=new Button(")");b19=new Button("RE");
lab.setBounds(0, 30, 400, 40);
lab.setFont(new Font("宋體",Font.PLAIN,30));
lab.setAlignment(Label.RIGHT);
pan.setBounds(0,60, 400, 300);
pan.setLayout(new GridLayout(5,4));
b0.addActionListener(new action());b1.addActionListener(new action());b2.addActionListener(new action());b3.addActionListener(new action());b4.addActionListener(new action());
b5.addActionListener(new action());b6.addActionListener(new action());b7.addActionListener(new action());b8.addActionListener(new action());b9.addActionListener(new action());
b10.addActionListener(new action());b11.addActionListener(new action());b12.addActionListener(new action());b13.addActionListener(new action());b14.addActionListener(new action());
b15.addActionListener(new action());b16.addActionListener(new action());b17.addActionListener(new action());b18.addActionListener(new action());b19.addActionListener(new action());
pan.add(b1);pan.add(b2);pan.add(b3);pan.add(b10);pan.add(b4);pan.add(b5);pan.add(b6);pan.add(b11);pan.add(b7);pan.add(b8);pan.add(b9);pan.add(b12);
pan.add(b0);pan.add(b14);pan.add(b15);pan.add(b13);pan.add(b16);pan.add(b17);pan.add(b18);pan.add(b19);
frm.add(lab);
frm.add(pan);
}
public double cal(String str)
{
str=str.trim();
StringTokenizer st=new StringTokenizer(str,"+-*/ ",true);
Stack sta=new Stack();
String s,s1,s2;
while(st.hasMoreTokens())
{
s=st.nextToken();
if(s.equals("#"))
break;
if(s.equals(" "))
continue;
if(!(s.equals("+")||s.equals("-")||s.equals("/")||s.equals("*")))
{
sta.InQuece(s);
}
else if(s.equals("+"))
{
s2=sta.DeQuece();
s1=sta.DeQuece();
Double d1=Double.parseDouble(s1);
Double d2=Double.parseDouble(s2);
d1=d1+d2;
sta.InQuece(""+d1);
}
else if(s.equals("-"))
{
s2=sta.DeQuece();
s1=sta.DeQuece();
Double d1=Double.parseDouble(s1);
Double d2=Double.parseDouble(s2);
d1=d1-d2;
sta.InQuece(""+d1);
}
else if(s.equals("/"))
{
s2=sta.DeQuece();
s1=sta.DeQuece();
Double d1=Double.parseDouble(s1);
Double d2=Double.parseDouble(s2);
d1=d1/d2;
sta.InQuece(""+d1);
}
else if(s.equals("*"))
{
s2=sta.DeQuece();
s1=sta.DeQuece();
Double d1=Double.parseDouble(s1);
Double d2=Double.parseDouble(s2);
d1=d1*d2;
sta.InQuece(""+d1);
}
}
s=sta.DeQuece();
return Double.parseDouble(s);
}
public String InfixToPostfix(String s)
{
String restr="";
String temp="";
StringTokenizer st=new StringTokenizer(s,"+-/*#() ",true);
Stack sta=new Stack();
sta.InQuece("#");
while(st.hasMoreTokens())
{
temp=st.nextToken();
if(temp.equals("#"))
{
while(true)
{
String t=sta.DeQuece();
if(t.equals("#"))
{
break;
}
restr=restr+t+" ";
}
break;
}
else if(temp.equals(" "))
continue;
else if(!(temp.equals("(")||temp.equals(")")||temp.equals("+")||temp.equals("-")||temp.equals("*")||temp.equals("/")))
{
restr=restr+temp+" ";
}
else if(temp.equals(")"))
{
while(true)
{
String t=sta.DeQuece();
if(t.equals("("))
break;
else
{
restr=restr+t+" ";
}
}
}
else if(temp.equals("(")||temp.equals("+")||temp.equals("-")||temp.equals("*")||temp.equals("/"))
{
while(icp(temp)<=isp(sta.Front()))
{
String t=sta.DeQuece();
restr=restr+t+" ";
}
sta.InQuece(temp);
}
//sta.Sprint();
}
return restr;
}
public int icp(String s)
{
if(s.equals("#"))
return 0;
else if(s.equals("("))
return 7;
else if(s.equals("*")||s.equals("/"))
return 4;
else if(s.equals("+")||s.equals("-"))
return 2;
else if(s.equals(")"))
return 1;
else
return -1;
}
public int isp(String s)
{
if(s.equals("#"))
return 0;
else if(s.equals("("))
return 1;
else if(s.equals("*")||s.equals("/"))
return 5;
else if(s.equals("+")||s.equals("-"))
return 3;
else if(s.equals(")"))
return 7;
else
return -1;
}
public static void main(String args[])
{
Calculator c=new Calculator();
c.setFrame();
System.out.println(c.cal(c.InfixToPostfix("1*(2+3/4)*10#")));
}
static class action implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Button bu=(Button)e.getSource();
//ltemp=labelstr;
if(flag==1)
{
labelstr="";
flag=0;
}
if(bu==b0)
labelstr=labelstr+"0";
else if(bu==b1)
labelstr=labelstr+"1";
else if(bu==b2)
labelstr=labelstr+"2";
else if(bu==b3)
labelstr=labelstr+"3";
else if(bu==b4)
labelstr=labelstr+"4";
else if(bu==b5)
labelstr=labelstr+"5";
else if(bu==b6)
labelstr=labelstr+"6";
else if(bu==b7)
labelstr=labelstr+"7";
else if(bu==b8)
labelstr=labelstr+"8";
else if(bu==b9)
labelstr=labelstr+"9";
else if(bu==b10)
labelstr=labelstr+"+";
else if(bu==b11)
labelstr=labelstr+"-";
else if(bu==b12)
labelstr=labelstr+"*";
else if(bu==b13)
labelstr=labelstr+"/";
else if(bu==b14)//AC
{
ltemp=labelstr;
labelstr="0.";
flag=1;
}
else if(bu==b15)//C
{
labelstr=labelstr.substring(0, labelstr.length()-1);
if(labelstr.length()==0)
{
labelstr="0.";
flag=1;
}
}
else if(bu==b16)//=
{
ltemp=labelstr;
double b=new Calculator().cal(new Calculator().InfixToPostfix(labelstr+"#"));
labelstr=""+b;
lab.setText(labelstr);
flag=1;
return;
}
else if(bu==b17)
{
labelstr=labelstr+"(";
}
else if(bu==b18)
{
labelstr=labelstr+")";
}
else if(bu==b19)
{
labelstr=ltemp;
}
lab.setText(labelstr);
}
}
static class window extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
frm.dispose();
System.exit(0);
}
}
}
⑸ 實現計算器
packagecn.hnpi;
importjava.awt.BorderLayout;
importjava.awt.GridLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JTextField;
{
JButtonb0=newJButton("0");
JButtonb1=newJButton("1");
JButtonb2=newJButton("2");
JButtonb3=newJButton("3");
JButtonb4=newJButton("4");
JButtonb5=newJButton("5");
JButtonb6=newJButton("6");
JButtonb7=newJButton("7");
JButtonb8=newJButton("8");
JButtonb9=newJButton("9");
JButtonjiaButton=newJButton("+");
JButtonjianButton=newJButton("-");
JButtonchengButton=newJButton("*");
JButtonchuButton=newJButton("/");
JButtonyuButton=newJButton("%");
JButtonjjButton=newJButton("+/-");
JButtonsqrtButton=newJButton("sqrt");
JButtondianButton=newJButton(".");
JButtondengButton=newJButton("=");
JButtonButton=newJButton("1/x");
JButtonbackButton=newJButton("Backpace");
JButtoncButton=newJButton("C");
publicdoubleop1;
publicdoubleop2;
publicstaticfinalintJIA=0;
publicstaticfinalintJIAN=1;
publicstaticfinalintCHENG=2;
publicstaticfinalintCHU=3;
publicstaticfinalintJJ=4;
publicstaticfinalintDIAN=5;
publicintcurrent0p=0;
privatebooleanopEnd=false;
JPanelpanel1=newJPanel();
JPanelpanel2=newJPanel();
JPanelpanel3=newJPanel();
JPanelpanel4=newJPanel();
JTextFieldresult=newJTextField(20);
publicCalculator(){
initPanel2();
initPanel3();
panel2.setLayout(newGridLayout(5,4));
panel1.setLayout(newBorderLayout());
panel1.add(panel3,BorderLayout.NORTH);//設置位置
panel1.add(panel2,BorderLayout.CENTER);//設置位置
getContentPane().add(panel1);
addActionListeners();
setSize(260,260);
setLocation(500,300);
setVisible(true);
setDefaultCloseOperation(Calculator.EXIT_ON_CLOSE);
this.setResizable(false);
this.setTitle("計算器");
}
privatevoidinitPanel2(){
//把組件添加到相應的panel上
panel2.add(b7);
panel2.add(b8);
panel2.add(b9);
panel2.add(chuButton);
panel2.add(b4);
panel2.add(b5);
panel2.add(b6);
panel2.add(chengButton);
panel2.add(b1);
panel2.add(b2);
panel2.add(b3);
panel2.add(jianButton);
panel2.add(b0);
panel2.add(jjButton);
panel2.add(dianButton);
panel2.add(jiaButton);
panel2.add(Button);
panel2.add(yuButton);
panel2.add(sqrtButton);
panel2.add(dengButton);
}
privatevoidaddActionListeners(){
ActionHandlerc=newActionHandler();
b0.addActionListener(c);
b1.addActionListener(c);
b2.addActionListener(c);
b3.addActionListener(c);
b4.addActionListener(c);
b5.addActionListener(c);
b6.addActionListener(c);
b7.addActionListener(c);
b8.addActionListener(c);
b9.addActionListener(c);
jiaButton.addActionListener(c);
dengButton.addActionListener(c);
chengButton.addActionListener(c);
chuButton.addActionListener(c);
jianButton.addActionListener(c);
jjButton.addActionListener(c);
dianButton.addActionListener(c);
sqrtButton.addActionListener(c);
yuButton.addActionListener(c);
Button.addActionListener(c);
backButton.addActionListener(c);
cButton.addActionListener(c);
}
{
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==b0){
if(opEnd==false){
result.setText("");
}
result.setText(result.getText()+"0");
}
if(e.getSource()==b1){
if(opEnd==false){
result.setText("");
}
result.setText(result.getText()+"1");
opEnd=true;
}
if(e.getSource()==b2){
if(opEnd==false){
result.setText("");
}
result.setText(result.getText()+"2");
opEnd=true;
}
if(e.getSource()==b3){
if(opEnd==false){
result.setText("");
}
result.setText(result.getText()+"3");
opEnd=true;
}
if(e.getSource()==b4){
if(opEnd==false){
result.setText("");
}
result.setText(result.getText()+"4");
opEnd=true;
}
if(e.getSource()==b5){
if(opEnd==false){
result.setText("");
}
result.setText(result.getText()+"5");
opEnd=true;
}
if(e.getSource()==b6){
if(opEnd==false){
result.setText("");
}
result.setText(result.getText()+"6");
opEnd=true;
}
if(e.getSource()==b7){
if(opEnd==false){
result.setText("");
}
result.setText(result.getText()+"7");
opEnd=true;
}
if(e.getSource()==b8){
if(opEnd==false){
result.setText("");
}
result.setText(result.getText()+"8");
opEnd=true;
}
if(e.getSource()==b9){
if(opEnd==false){
result.setText("");
}
result.setText(result.getText()+"9");
opEnd=true;
}
try{
if(e.getSource()==jiaButton){
op1=Double.parseDouble(result.getText());
//2、說明操作數已經輸入完畢
opEnd=false;
current0p=JIA;
}
if(e.getSource()==chengButton){
op1=Double.parseDouble(result.getText());
//2、說明操作數已經輸入完畢
opEnd=false;
current0p=CHENG;
}
if(e.getSource()==chuButton){
op1=Double.parseDouble(result.getText());
//2、說明操作數已經輸入完畢
opEnd=false;
current0p=CHU;
}
if(e.getSource()==jianButton){
op1=Double.parseDouble(result.getText());
//2、說明操作數已經輸入完畢
opEnd=false;
current0p=JIAN;
}
if(e.getSource()==jjButton){
Stringtmp=result.getText();
if(tmp.equals("")||tmp.equals("0")){
return;
}
if(tmp.charAt(0)=='-'){
tmp=tmp.substring(1);
}else{
tmp='-'+tmp;
}
result.setText(tmp);
}
if(e.getSource()==dianButton){
Stringtmp=result.getText();
if(tmp.equals("")){
return;
}
if(tmp.indexOf(".")!=-1){
return;
}
tmp=tmp+".";
result.setText(tmp);
}
if(e.getSource()==sqrtButton){
Stringtmp=result.getText();
if(tmp.equals("")){
return;
}
doubled;
d=Double.parseDouble(tmp);//先定義一個double類型的d
if(d<0){
result.setText("不能對負數求平方根!");
return;
}
op2=Math.sqrt(d);
result.setText(op2+"");
}
if(e.getSource()==backButton){
Strings=result.getText();
result.setText("");
for(inti=0;i<s.length()-1;i++){
chara=s.charAt(i);
result.setText(result.getText()+a);
}
}
if(e.getSource()==cButton){
result.setText("0");
opEnd=false;
}
if(e.getSource()==dengButton){
op2=Double.parseDouble(result.getText());
switch(current0p){
caseJIA:
result.setText(op1+op2+"");
break;
caseJIAN:
result.setText(op1-op2+"");
break;
caseCHENG:
result.setText(op1*op2+"");
break;
caseCHU:
if(op2==0){
result.setText("被除數不能為零!");
break;
}
result.setText(op1/op2+"");
break;
}
opEnd=false;
}
}catch(Exceptione1){
result.setText("Wrong");
opEnd=false;
}
}
}
privatevoidinitPanel3(){
panel3.setLayout(newGridLayout(2,1));
panel3.add(result);
panel3.add(panel4);
panel4.setLayout(newGridLayout(1,2));
panel4.add(backButton);
panel4.add(cButton);
//panel3.setPreferredSize(newDimension(260,65));
}
publicstaticvoidmain(String[]args){
Calculatorc=newCalculator();//生成類的實例
}
}
⑹ c語言設計一個簡單的計算器程序
#include<stdio.h>//計算器
voidmenu()//自定義的菜單界面
{
printf("--------------------\n");
printf("請輸入你的選擇\n");
printf("1.+\n");
printf("2.-\n");
printf("3.*\n");
printf("4./\n");
printf("--------------------\n");
}
intmain()
{
inti=0;
intj=0;
intnum=0;//計算結果存放在nun
intselect=0;//選擇的選項存放在select
do//do-while先執行再判斷循環條件,即可實現重復計算功能
{
menu();//列印出菜單界面
scanf("%d",&select);//輸入你的選項
printf("請輸入計算值:");
scanf("%d%d",&i,&j);//輸入要計算的數值
switch(select)
{
case1:
printf("%d+%d=%d\n",i,j,num=i+j);//實現加法功能
break;
case2:
printf("%d-%d=%d\n",i,j,num=i-j);//實現減法功能
break;
case3:
printf("%d*%d=%d\n",i,j,num=i*j);//實現乘法功能
break;
case4:
printf("%d-%d=%d\n",i,j,num=i/j);//實現除法功能
break;
default:
printf("輸入有誤重新選擇");
break;
}
}while(select);
return0;
}
運行結果:
return表示把程序流程從被調函數轉向主調函數並把表達式的值帶回主調函數,實現函數值的返回,返回時可附帶一個返回值,由return後面的參數指定。
return通常是必要的,因為函數調用的時候計算結果通常是通過返回值帶出的。如果函數執行不需要返回計算結果,也經常需要返回一個狀態碼來表示函數執行的順利與否(-1和0就是最常用的狀態碼),主調函數可以通過返回值判斷被調函數的執行情況。
⑺ 如何用matlab的GUI製作簡易二進制計算器
1、布置控制項:guide建立新的GUI界面,然後添加相應的控制項;2、編寫回調函數:分別為各控制項添加回調函數;3、代碼調試與編譯:試試代碼運行狀況及錯誤代碼調試,最後可以打包編譯為exe文件。可以給你發個簡單的計算器代碼,以幫助學習gui。
⑻ (高分)求一個正確lex和yacc編的計算器(編譯原理)
網上多的是,大多可以運行。關鍵是你要在Linux下分別將 lex和yacc文件用 flex 和 bison 編譯成對應的c文件,然後在windows下用VC或者Codeblock的IDE下編寫界面,連接剛才對應的c文件,生成exe交給老師。
⑼ 計算器軟體
下載就夠了從網上搜
(6)微機操作系統
微機操作系統隨著微機硬體技術的發展而發展,從簡單到復雜。Microsoft公司開發的DOS是一單用戶單任務系統,而Windows操作系統則是一單用戶多任務系統,經過十幾年的發展,已從Windows 3.1發展到目前的Windows NT、Windows 2000和Windows XP,它是當前微機中廣泛使用的操作系統之一。Linux是一個原碼公開的操作系統,目前已被越來越多的用戶所採用,是Windows操作系統強有力的競爭對手。
2)語言處理系統(翻譯程序)
如前所述,機器語言是計算機唯一能直接識別和執行的程序語言。如果要在計算機上運行高級語言程序就必須配備程序語言翻譯程序(下簡稱翻譯程序)。翻譯程序本身是一組程序,不同的高級語言都有相應的翻譯程序。
對於高級語言來說,翻譯的方法有兩種:
一種稱為「解釋」。早期的BASIC源程序的執行都採用這種方式。它調用機器配備的BASIC「解釋程序」,在運行BASIC源程序時,逐條把BASIC的源程序語句進行解釋和執行,它不保留目標程序代碼,即不產生可執行文件。這種方式速度較慢,每次運行都要經過「解釋」,邊解釋邊執行。
另一種稱為「編譯」,它調用相應語言的編譯程序,把源程序變成目標程序(以.OBJ為擴展名),然後再用連接程序,把目標程序與庫文件相連接形成可執行文件。盡管編譯的過程復雜一些,但它形成的可執行文件(以.exe為擴展名)可以反復執行,速度較快。運行程序時只要鍵入可執行程序的文件名,再按Enter鍵即可。
對源程序進行解釋和編譯任務的程序,分別叫做編譯程序和解釋程序。如FORTRAN、COBOL、PASCAL和C等高級語言,使用時需有相應的編譯程序;BASIC、LISP等高級語言,使用時需用相應的解釋程序。
3)服務程序
服務程序能夠提供一些常用的服務性功能,它們為用戶開發程序和使用計算機提供了方便,像微機上經常使用的診斷程序、調試程序、編輯程序均屬此類。
4)資料庫管理系統
在信息社會里,社會和生產活動產生的信息很多,使人工管理難以應付,人們希望藉助計算機對信息進行搜集、存儲、處理和使用。資料庫系統(Data Base System, DBS)就是在這種需求背景下產生和發展的。
資料庫是指按照一定聯系存儲的數據集合,可為多種應用共享。資料庫管理系統(Data Base Management System, DBMS)則是能夠對資料庫進行加工、管理的系統軟體。其主要功能是建立、消除、維護資料庫及對庫中數據進行各種操作。資料庫系統主要由資料庫(DB)、資料庫管理系統(DBMS)以及相應的應用程序組成。資料庫系統不但能夠存放大量的數據,更重要的是能迅速、自動地對數據進行檢索、修改、統計、排序、合並等操作,以得到所需的信息。這一點是傳統的文件櫃無法做到的。
資料庫技術是計算機技術中發展最快、應用最廣的一個分支。可以說,在今後的計算機應用開發中大都離不開資料庫。因此,了解資料庫技術尤其是微機環境下的資料庫應用是非常必要的。
2應用軟體
為解決各類實際問題而設計的程序系統稱為應用軟體。從其服務對象的角度,又可分為通用軟體和專用軟體兩類。
1)通用軟體
這類軟體通常是為解決某一類問題而設計的,而這類問題是很多人都要遇到和解決的。例如:文字
⑽ 編譯原理簡單文法歸約計算
編譯原理中的語法和文法是不一樣的,但卻融會貫通。
在計算機科學中,文法是編譯原理的基礎,是描述一門程序設計語言和實現其編譯器的方法。
文法分成四種類型,即0型、1型、2型和3型。這幾類文法的差別在於對產生式施加不同的限制。
形式語言,這種理論對計算機科學有著深刻的影響,特別是對程序設計語言的設計、編譯方法和計算復雜性等方面更有重大的作用。
多數程序設計語言的單詞的語法都能用正規文法或3型文法(3型文法G=(VN,VT,P,S)的P中的規則有兩種形式:一種是前面定義的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一種形式是:A→Ba或A→a,前者稱為右線性文法,後者稱為左線性文法。正規文法所描述的是VT*上的正規集)來描述。
四個文法類的定義是逐漸增加限制的,因此每一種正規文法都是上下文無關的,每一種上下文無關文法都是上下文有關的,而每一種上下文有關文法都是0型文法。稱0型文法產生的語言為0型語言。上下文有關文法、上下文無關文法和正規文法產生的語言分別稱為上下文有關語言、上下文無關語言和正規語言。