GNU Bison

GNU Bison
Original author(s)Robert Corbett
Developer(s)The GNU Project
Initial releaseJune 1985; 39 years ago (1985-06)[1]
Stable release
3.8.2[2] Edit this on Wikidata / 25 September 2021
Repository
Written inC and m4
Operating systemUnix-like
TypeParser generator
LicenseGPL
Websitewww.gnu.org/software/bison/ Edit this on Wikidata

GNU Bison, commonly known as Bison, is a parser generator that is part of the GNU Project. Bison reads a specification in Bison syntax (described as "machine-readable BNF"[3]), warns about any parsing ambiguities, and generates a parser that reads sequences of tokens and decides whether the sequence conforms to the syntax specified by the grammar.

The generated parsers are portable: they do not require any specific compilers. Bison by default generates LALR(1) parsers but it can also generate canonical LR, IELR(1) and GLR parsers.[4]

In POSIX mode, Bison is compatible with Yacc, but also has several extensions over this earlier program, including

  • Generation of counterexamples for conflicts
  • Location tracking (e.g., file, line, column)
  • Rich and internationalizable syntax error messages in the generated parsers
  • Customizable syntax error generation,
  • Reentrant parsers
  • Push parsers, with autocompletion
  • Support for named references
  • Several types of reports (graphical, XML) on the generated parser
  • Support for several programming languages (C, C++, D, or Java)

Flex, an automatic lexical analyser, is often used with Bison, to tokenise input data and provide Bison with tokens.[5]

Bison was originally written by Robert Corbett in 1985.[1] Later, in 1989, Robert Corbett released another parser generator named Berkeley Yacc. Bison was made Yacc-compatible by Richard Stallman.[6]

Bison is free software and is available under the GNU General Public License, with an exception (discussed below) allowing its generated code to be used without triggering the copyleft requirements of the licence.

Features

Counterexample generation

One delicate issue with LR parser generators is the resolution of conflicts (shift/reduce and reduce/reduce conflicts). With many LR parser generators, resolving conflicts requires the analysis of the parser automaton, which demands some expertise from the user.

To aid the user in understanding conflicts more intuitively, Bison can instead automatically generate counterexamples. For ambiguous grammars, Bison often can even produce counterexamples that show the grammar is ambiguous.

For instance, on a grammar suffering from the infamous dangling else problem, Bison reports

doc/if-then-else.y: warning: shift/reduce conflict on token "else" [-Wcounterexamples]
  Example: "if" expr "then" "if" expr "then" stmt  "else" stmt
  Shift derivation
    if_stmt
    ↳ "if" expr "then" stmt
                         if_stmt
                           ↳ "if" expr "then" stmt  "else" stmt
  Example: "if" expr "then" "if" expr "then" stmt  "else" stmt
  Reduce derivation
    if_stmt
    ↳ "if" expr "then" stmt                        "else" stmt
                         if_stmt
                           ↳ "if" expr "then" stmt 

Reentrancy

Reentrancy is a feature which has been added to Bison and does not exist in Yacc.

Normally, Bison generates a parser which is not reentrant. In order to achieve reentrancy the declaration %define api.pure must be used. More details on Bison reentrancy can be found in the Bison manual.[7]

Output languages

Bison can generate code for C, C++, D and Java.[8]

For using the Bison-generated parser from other languages a language binding tool such as SWIG can be used.

License and distribution of generated code

Because Bison generates source code that in turn gets added to the source code of other software projects, it raises some simple but interesting copyright questions.

A GPL-compatible license is not required

The code generated by Bison includes significant amounts of code from the Bison project itself. The Bison package is distributed under the terms of the GNU General Public License (GPL) but an exception has been added so that the GPL does not apply to output.[9][10]

Earlier releases of Bison stipulated that parts of its output were also licensed under the GPL, due to the inclusion of the yyparse() function from the original source code in the output.

Distribution of packages using Bison

Free software projects that use Bison may have a choice of whether to distribute the source code which their project feeds into Bison, or the resulting C code made output by Bison. Both are sufficient for a recipient to be able to compile the project source code. However, distributing only the input carries the minor inconvenience that the recipients must have a compatible copy of Bison installed so that they can generate the necessary C code when compiling the project. And distributing only the C code in output, creates the problem of making it very difficult for the recipients to modify the parser since this code was written neither by a human nor for humans - its purpose is to be fed directly into a C compiler.

These problems can be avoided by distributing both the input files and the generated code. Most people will compile using the generated code, no different from any other software package, but anyone who wants to modify the parser component can modify the input files first and re-generate the generated files before compiling. Projects distributing both usually do not have the generated files in their version control systems. The files are only generated when making a release.

Some licenses, such as the GPL, require that the source code be in "the preferred form of the work for making modifications to it". GPL'd projects using Bison must thus distribute the files which are the input for Bison. Of course, they can also include the generated files.

Use

Because Bison was written as a replacement for Yacc, and is largely compatible, the code from a lot of projects using Bison could equally be fed into Yacc. This makes it difficult to determine if a project "uses" Bison-specific source code or not. In many cases, the "use" of Bison could be trivially replaced by the equivalent use of Yacc or one of its other derivatives.

Bison has features not found in Yacc, so some projects can be truly said to "use" Bison, since Yacc would not suffice.

The following list is of projects which are known to "use" Bison in the looser sense, that they use free software development tools and distribute code which is intended to be fed into Bison or a Bison-compatible package.

  • Bash shell uses a yacc grammar for parsing the command input.
  • Bison's own grammar parser is generated by Bison.[11]
  • CMake uses several Bison grammars.[12]
  • GCC started out using Bison, but switched to a hand-written recursive-descent parser for C++ in 2004 (version 3.4),[13] and for C and Objective-C in 2006 (version 4.1)[14]
  • The Go programming language (GC) used Bison, but switched to a hand-written scanner and parser in version 1.5.[15]
  • LilyPond requires Bison to generate its parser.[16]
  • MySQL[17]
  • GNU Octave uses a Bison-generated parser.[18]
  • Perl 5 uses a Bison-generated parser starting in 5.10.[19]
  • The PHP programming language (Zend Parser).
  • PostgreSQL[20]
  • Ruby MRI, the reference implementation of the Ruby programming language, relies on a Bison grammar.[21]
  • syslog-ng uses several Bison grammars assembled together.[22]

A complete reentrant parser example

‹The template Manual is being considered for merging.› 

The following example shows how to use Bison and flex to write a simple calculator program (only addition and multiplication) and a program for creating an abstract syntax tree. The next two files provide definition and implementation of the syntax tree functions.

/*
 * Expression.h
 * Definition of the structure used to build the syntax tree.
 */
#ifndef __EXPRESSION_H__
#define __EXPRESSION_H__

/**
 * @brief The operation type
 */
typedef enum tagEOperationType
{
    eVALUE,
    eMULTIPLY,
    eADD
} EOperationType;

/**
 * @brief The expression structure
 */
typedef struct tagSExpression
{
    EOperationType type; /* /< type of operation */

    int value; /* /< valid only when type is eVALUE */
    struct tagSExpression *left; /* /<  left side of the tree */
    struct tagSExpression *right; /* /< right side of the tree */
} SExpression;

/**
 * @brief It creates an identifier
 * @param value The number value
 * @return The expression or NULL in case of no memory
 */
SExpression *createNumber(int value);

/**
 * @brief It creates an operation
 * @param type The operation type
 * @param left The left operand
 * @param right The right operand
 * @return The expression or NULL in case of no memory
 */
SExpression *createOperation(EOperationType type, SExpression *left, SExpression *right);

/**
 * @brief Deletes a expression
 * @param b The expression
 */
void deleteExpression(SExpression *b);

#endif /* __EXPRESSION_H__ */
/*
 * Expression.c
 * Implementation of functions used to build the syntax tree.
 */

#include "Expression.h"

#include <stdlib.h>

/**
 * @brief Allocates space for expression
 * @return The expression or NULL if not enough memory
 */
static SExpression *allocateExpression()
{
    SExpression *b = (SExpression *)malloc(sizeof(SExpression));

    if (b == NULL)
        return NULL;

    b->type = eVALUE;
    b->value = 0;

    b->left = NULL;
    b->right = NULL;

    return b;
}

SExpression *createNumber(int value)
{
    SExpression *b = allocateExpression();

    if (b == NULL)
        return NULL;

    b->type = eVALUE;
    b->value = value;

    return b;
}

SExpression *createOperation(EOperationType type, SExpression *left, SExpression *right)
{
    SExpression *b = allocateExpression();

    if (b == NULL)
        return NULL;

    b->type = type;
    b->left = left;
    b->right = right;

    return b;
}

void deleteExpression(SExpression *b)
{
    if (b == NULL)
        return;

    deleteExpression(b->left);
    deleteExpression(b->right);

    free(b);
}

The tokens needed by the Bison parser will be generated using flex.

%{

/*
 * Lexer.l file
 * To generate the lexical analyzer run: "flex Lexer.l"
 */

#include "Expression.h"
#include "Parser.h"

#include <stdio.h>

%}

%option outfile="Lexer.c" header-file="Lexer.h"
%option warn nodefault

%option reentrant noyywrap never-interactive nounistd
%option bison-bridge

%%

[ \r\n\t]*   { continue; /* Skip blanks. */ }
[0-9]+       { sscanf(yytext, "%d", &yylval->value); return TOKEN_NUMBER; }

"*"          { return TOKEN_STAR; }
"+"          { return TOKEN_PLUS; }
"("          { return TOKEN_LPAREN; }
")"          { return TOKEN_RPAREN; }

.            { continue; /* Ignore unexpected characters. */}

%%

int yyerror(SExpression **expression, yyscan_t scanner, const char *msg) {
    fprintf(stderr, "Error: %s\n", msg);
    return 0;
}

The names of the tokens are typically neutral: "TOKEN_PLUS" and "TOKEN_STAR", not "TOKEN_ADD" and "TOKEN_MULTIPLY". For instance if we were to support the unary "+" (as in "+1"), it would be wrong to name this "+" "TOKEN_ADD". In a language such as C, "int *ptr" denotes the definition of a pointer, not a product: it would be wrong to name this "*" "TOKEN_MULTIPLY".

Since the tokens are provided by flex we must provide the means to communicate between the parser and the lexer.[23] The data type used for communication, YYSTYPE, is set using Bison %union declaration.

Since in this sample we use the reentrant version of both flex and yacc we are forced to provide parameters for the yylex function, when called from yyparse.[23] This is done through Bison %lex-param and %parse-param declarations.[24]

%{

/*
 * Parser.y file
 * To generate the parser run: "bison Parser.y"
 */

#include "Expression.h"
#include "Parser.h"
#include "Lexer.h"

// reference the implementation provided in Lexer.l
int yyerror(SExpression **expression, yyscan_t scanner, const char *msg);

%}

%code requires {
  typedef void* yyscan_t;
}

%output  "Parser.c"
%defines "Parser.h"

%define api.pure
%lex-param   { yyscan_t scanner }
%parse-param { SExpression **expression }
%parse-param { yyscan_t scanner }

%union {
    int value;
    SExpression *expression;
}

%token TOKEN_LPAREN   "("
%token TOKEN_RPAREN   ")"
%token TOKEN_PLUS     "+"
%token TOKEN_STAR     "*"
%token <value> TOKEN_NUMBER "number"

%type <expression> expr

/* Precedence (increasing) and associativity:
   a+b+c is (a+b)+c: left associativity
   a+b*c is a+(b*c): the precedence of "*" is higher than that of "+". */
%left "+"
%left "*"

%%

input
    : expr { *expression = $1; }
    ;

expr
    : expr[L] "+" expr[R] { $$ = createOperation( eADD, $L, $R ); }
    | expr[L] "*" expr[R] { $$ = createOperation( eMULTIPLY, $L, $R ); }
    | "(" expr[E] ")"     { $$ = $E; }
    | "number"            { $$ = createNumber($1); }
    ;

%%

The code needed to obtain the syntax tree using the parser generated by Bison and the scanner generated by flex is the following.

/*
 * main.c file
 */

#include "Expression.h"
#include "Parser.h"
#include "Lexer.h"

#include <stdio.h>

int yyparse(SExpression **expression, yyscan_t scanner);

SExpression *getAST(const char *expr)
{
    SExpression *expression;
    yyscan_t scanner;
    YY_BUFFER_STATE state;

    if (yylex_init(&scanner)) {
        /* could not initialize */
        return NULL;
    }

    state = yy_scan_string(expr, scanner);

    if (yyparse(&expression, scanner)) {
        /* error parsing */
        return NULL;
    }

    yy_delete_buffer(state, scanner);

    yylex_destroy(scanner);

    return expression;
}

int evaluate(SExpression *e)
{
    switch (e->type) {
        case eVALUE:
            return e->value;
        case eMULTIPLY:
            return evaluate(e->left) * evaluate(e->right);
        case eADD:
            return evaluate(e->left) + evaluate(e->right);
        default:
            /* should not be here */
            return 0;
    }
}

int main(void)
{
    char test[] = " 4 + 2*10 + 3*( 5 + 1 )";
    SExpression *e = getAST(test);
    int result = evaluate(e);
    printf("Result of '%s' is %d\n", test, result);
    deleteExpression(e);
    return 0;
}

A simple makefile to build the project is the following.

# Makefile

FILES = Lexer.c Parser.c Expression.c main.c
CC = g++
CFLAGS = -g -ansi

test: $(FILES)
	$(CC) $(CFLAGS) $(FILES) -o test

Lexer.c: Lexer.l
	flex Lexer.l

Parser.c: Parser.y Lexer.c
	bison Parser.y

clean:
	rm -f *.o *~ Lexer.c Lexer.h Parser.c Parser.h test

See also

  • Berkeley Yacc (byacc) – another free software Yacc replacement sharing the same author as GNU Bison
  • ANTLR ANother Tool for Language Recognition, another open-source parser generator

References

  1. ^ a b Corbett, Robert Paul (June 1985). Static Semantics and Compiler Error Recovery (Ph.D.). University of California, Berkeley. DTIC ADA611756.
  2. ^ Akim Demaille (25 September 2021). "Bison 3.8.2".
  3. ^ "Language and Grammar (Bison 3.8.1)". www.gnu.org. Retrieved 2021-12-26.
  4. ^ Bison Manual: Introduction.
  5. ^ Levine, John (August 2009). flex & bison. O'Reilly Media. ISBN 978-0-596-15597-1.
  6. ^ "AUTHORS". bison.git. GNU Savannah. Retrieved 2017-08-26.
  7. ^ Bison Manual: A Pure (Reentrant) Parser
  8. ^ Bison Manual: Bison Declaration Summary
  9. ^ Bison Manual: Conditions for Using Bison
  10. ^ A source code file, parse-gram.c, which includes the exception
  11. ^ "parse-gram.y". bison.git. GNU Savannah. Retrieved 2020-07-29.
  12. ^ "LexerParser in CMake". github.com.
  13. ^ GCC 3.4 Release Series Changes, New Features, and Fixes
  14. ^ GCC 4.1 Release Series Changes, New Features, and Fixes
  15. ^ Golang grammar definition
  16. ^ "Parser.yy - GNU LilyPond Git Repository". git.savannah.gnu.org.
  17. ^ "4. Parsing SQL - flex & bison [Book]".
  18. ^ "GNU Octave: Libinterp/Parse-tree/Oct-parse.cc Source File".
  19. ^ "What is new for perl 5.10.0?". perl.org.
  20. ^ "The Parser Stage". postgresql.org. 30 September 2021.
  21. ^ "Ruby MRI Parser". github.com.
  22. ^ "syslog-ng's XML Parser". github.com. 14 October 2021.
  23. ^ a b Flex Manual: C Scanners with Bison Parsers Archived 2010-12-17 at the Wayback Machine
  24. ^ Bison Manual: Calling Conventions for Pure Parsers

Further reading

Read other articles:

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Februari 2023. Hotstar adalah platform hiburan digital India yang diluncurkan pada bulan Februari 2015 oleh Disney Star. Layanan ini dimiliki oleh The Walt Disney Company.[1] Layanan ini menyediakan video sesuai permintaan secara daring.[2][3]...

 

 

.by

.byDiperkenalkan10 Mei 1994Jenis TLDTLD kode negara InternetStatusAktifRegistriReliable Software Inc.SponsorOperations and Analysis Centre under the President of the Republic of BelarusPemakaian yang diinginkanEntitas yang berhubungan dengan  BelarusPemakaian aktualDigunakan di Belarus dan BavariaDomain terdaftar135,696 (28 September 2020)[1]PembatasanTak adaStrukturRegsitrasi dilakukan di tingkat kedua ata ketiga, dibawah label tingkat duaDNSSECYaSitus webcctld.by .by adalah top...

 

 

Artikel ini membutuhkan rujukan tambahan agar kualitasnya dapat dipastikan. Mohon bantu kami mengembangkan artikel ini dengan cara menambahkan rujukan ke sumber tepercaya. Pernyataan tak bersumber bisa saja dipertentangkan dan dihapus.Cari sumber: Angkatan Laut Uni Soviet – berita · surat kabar · buku · cendekiawan · JSTOR (November 2018)Angkatan Laut Uni SovietВоенно-морской флот СССР Voyenno-morskoy flot SSSRBendera dari Angkatan...

South American administrative district of Spain (1542–1824) See also: List of Viceroys of Peru Kingdom of PeruReino del Perú1542–1824 Coat of arms of Lima[a] Motto: Plus Ultra (Latin) Further BeyondAnthem: Marcha RealRoyal MarchFlag of Spain: first national flag, naval and fortress flag, the last flag to float in continental America, in the Real Felipe Fortress[3][4][5]Location of the Viceroyalty of Peru: initial territory 1542–1718 (light gree...

 

 

For the field of study, see Neural development. Academic journalDevelopmental NeurobiologyDisciplineNeural developmentLanguageEnglishEdited byBin Chen, Song-Hai Shi, Andreas ProkopPublication detailsFormer name(s)Journal of NeurobiologyHistory1969-presentPublisherWiley-BlackwellFrequencyMonthlyOpen accessDelayed, after 12 monthsImpact factor3.935 (2019)Standard abbreviationsISO 4 (alt) · Bluebook (alt1 · alt2)NLM (alt) · MathSciNet (alt )ISO 4Dev...

 

 

For similarly titled films, see Jinn (disambiguation). 2013 Emirati filmDjinnTheatrical release posterDirected byTobe HooperWritten byDavid TullyProduced byDaniela TullyTim SmytheStarringKhalid LaithRazane JammalCinematographyJoel RansomEdited byAndrew CohenMark StevensMusic byBC SmithProductioncompaniesImage NationFilmWorksRelease date 25 October 2013 (2013-10-25) (Abu Dhabi Film Festival) Running time85 minutesCountryUnited Arab EmiratesLanguagesArabicEnglishBudgetUS$5 mi...

Lorenzo Richelmy2017Lahir25 Maret 1990 (umur 34)La Spezia, ItaliaKebangsaanItaliaPekerjaanAktorDikenal atasMarco Polo Lorenzo Richelmy (lahir 25 Maret 1990) adalah aktor asal Italia, yang paling dikenal oleh penonton di luar Italia untuk penampilannya dalam seri asli Netflix Marco Polo. Sebelum berperan dalam serial tersebut, ia muncul di beberapa acara televisi dan film Italia. Ia menempuh pendidikan di Centro Sperimentale di Cinematografia, dan merupakan siswa termuda yang pernah masu...

 

 

Student newspaper of the University of Edinburgh The StudentFirst edition of The Student front page, 8 November 1887TypeFortnightly newspaperFormatBerlinerEditorLucy Frewin, Sarah Challen Flynn, Anna Claire ShumanFounded8 November 1887Political alignmentNoneLanguageEnglishHeadquartersThe Pleasance, EdinburghCirculation2,500 (25,000 per month online)Websitethestudentnews.co.uk The Student is a fortnightly independent newspaper produced by students at the University of Edinburgh. It held the ti...

 

 

Getreidegasse Getreidegasse adalah sebuah jalan sempit yang terletak pusat kota bersejarah Salzburg di Austria. Jalan yang hanya dapat dilewati oleh pejalan kaki ini merupakan pusat perbelanjaan sekaligus tempat wisata. Gedung paling terkenal yang berada di jalan ini adalah tempat kelahiran musisi Wolfgang Amadeus Mozart di Getreidegasse nomor 9, dan ia tinggal di rumah tersebut hingga ia berumur 17 tahun. Jalan ini pertama kali disebutkan dalam sejarah dengan nama Trabegasse sekitar tahun 11...

Hungarian composer Ligeti redirects here. For other people with the surname, see Ligeti (surname). The native form of this personal name is Ligeti György Sándor. This article uses Western name order when mentioning individuals. You can help expand this article with text translated from the corresponding article in Hungarian. (March 2024) Click [show] for important translation instructions. View a machine-translated version of the Hungarian article. Machine translation, like DeepL o...

 

 

Homoseksual legal   Pernikahan sesama jenis diakui   Pasangan sesama jenis tidak diakui Homoseksual ilegal   Hukuman   Dipenjara seumur hidup   Hukuman mati Hak lesbian, gay, biseksual dan transgender (LGBT) di Afrika terbatas jika dibandingkan dengan wilayah lain di dunia. BBC memperkirakan bahwa 38 negara Afrika melarang homoseksual. Di 13 negara, homoseksual legal atau tidak ada hukum yang menyinggungnya.[1] Di Mauritania, Somalia d...

 

 

У этого термина существуют и другие значения, см. Горностай (значения). Горностай Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:Челюстнороты...

Questa voce sull'argomento calciatori olandesi è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. Tim Breukers Nazionalità  Paesi Bassi Altezza 178 cm Peso 76 kg Calcio Ruolo Difensore Squadra  Quick '20 CarrieraSquadre di club1 2007-2012 Heracles Almelo134 (0)2012-2015 Twente23 (0)2013-2015 Jong Twente15 (0)2015-2021 Heracles Almelo148 (1)2021- Quick '20? (?) 1 I due n...

 

 

ヨハネス12世 第130代 ローマ教皇 教皇就任 955年12月16日教皇離任 964年5月14日先代 アガペトゥス2世次代 レオ8世個人情報出生 937年スポレート公国(中部イタリア)スポレート死去 964年5月14日 教皇領、ローマ原国籍 スポレート公国親 父アルベリーコ2世(スポレート公)、母アルダその他のヨハネステンプレートを表示 ヨハネス12世(Ioannes XII、937年 - 964年5月14日)は、ロ...

 

 

Monumen pipa air di Mytishchi (Rusia). Pipa air adalah pipa atau selang yang kebanyakan terbuat dari karet sintesis yang membawa air bersih dari satu tempat ke tempat lain. Sejarah pipa air di Indonesia Pada 1963, seorang bernama Pandji Wisaksana mendirikan PT Prakasa Pralon yang memproduksi pipa PVC dengan kualitas standar Jepang. Pralon merupakan pionir pipa air hingga sampai sekarang orang-orang indonesia lebih mengenal pipa paralon ketimbang pipa PVC. Tipe-tipe pipa air Berikut adalah beb...

Anti-tank weapon APILAS The APILAS on display at the 2014 Flag Day event, sponsored by the Finnish military.TypeAnti-tank weaponPlace of originFranceService historyIn service1985-presentUsed bySee OperatorsWars Gulf War[1] Syrian Civil War[2] Production historyDesignerGIAT IndustriesManufacturerGIAT IndustriesUnit cost€2,000Produced1985-2006No. built120,000SpecificationsMass9 kg (19.84 lb)Length1,300 mm (51.2 in)Barrel l...

 

 

هذه المقالة بحاجة لصندوق معلومات. فضلًا ساعد في تحسين هذه المقالة بإضافة صندوق معلومات مخصص إليها. يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (ديسمبر 2018) هذه ال...

 

 

Archosaurian reptiles that dominated the Mesozoic Era For other uses, see Dinosaur (disambiguation). Not to be confused with Dinosaurus. DinosaursTemporal range: Late Triassic–Present, 233.23 – 0 Mya (range includes birds) PreꞒ Ꞓ O S D C P T J K Pg N (possible Middle Triassic record) Herrerasaurus ischigualastensis(a carnivorous basal dinosaur)Triceratops horridus(a ceratopsian)Stegosaurus stenops(a stegosaur)Apatosaurus louisae(a sauropod)Edmontosaurus regalis(a hadrosaurid ornithopo...

  لمعانٍ أخرى، طالع ديفيد برات (توضيح). ديفيد برات   معلومات شخصية الميلاد 3 يناير 1955 (69 سنة)[1]  أوتاوا  مواطنة كندا  مناصب وزير الدفاع الوطني   في المنصب12 ديسمبر 2003  – 19 يوليو 2004  جون ماكالوم  بيل غراهام  الحياة العملية المهنة سياسي  الحزب الح�...

 

 

Di awal 2023, suatu polemik timbul ketika PT Kereta Api Indonesia (KAI) melalui anak usahanya KAI Commuter berniat mengimpor 348 unit KRL bekas dari Jepang. KRL bekas ini ditujukan untuk menggantikan gerbong KRL Commuter Line yang lebih tua dan untuk meningkatkan kapasitas penumpang. Polemik ini muncul karena penolakan Kementerian Perindustrian dan Kementerian Koordinator Bidang Kemaritiman dan Investasi. Kedua kementerian tersebut lebih memilih KRL baru produksi domestik PT INKA, meskipun le...