[qfcc] Implement glsl syntax

No semantics yet, but qfcc can parse some of QF's shaders. The grammar
mostly follows that in the OpenGL Shading Language, Version 4.60.7 spec,
but with a few less tokens.
This commit is contained in:
Bill Currie 2024-04-19 12:44:57 +09:00
parent b798cb2603
commit 2dd23f429a
8 changed files with 661 additions and 1437 deletions

View file

@ -117,12 +117,16 @@ extern pr_info_t pr;
const char *file_basename (const char *filename, int keepdot) __attribute__((pure));
int glsl_yyparse (FILE *in);
int qc_yyparse (FILE *in);
int qp_yyparse (FILE *in);
extern int pre_yydebug;
extern int glsl_yydebug;
extern int qc_yydebug;
extern int qp_yydebug;
#define ARRCOUNT(_k) (sizeof (_k) / sizeof (_k[0]))
#ifdef _WIN32
char *fix_backslash (char *path);
#define NORMALIZE(x) fix_backslash (x)

View file

@ -163,4 +163,5 @@ int rua_parse (FILE *in, rua_parser_t *parser);
const char *rua_directive_get_key (const void *dir, void *unused) __attribute__((pure));
const char *rua_keyword_get_key (const void *dir, void *unused) __attribute__((pure));
#endif//__rua_lang_h

File diff suppressed because it is too large Load diff

View file

@ -102,6 +102,7 @@ parse_error (void *scanner)
%right <op> '=' ASX
%right '?' ':'
%left OR
%left XOR
%left AND
%left '|'
%left '^'
@ -113,15 +114,17 @@ parse_error (void *scanner)
%left SHL SHR
%left '+' '-'
%left '*' '/' '%' MOD SCALE GEOMETRIC
%left '*' '/' '%' MOD SCALE GEOMETRIC QMUL QVMUL VQMUL
%left HADAMARD CROSS DOT WEDGE REGRESSIVE
%right SIZEOF UNARY INCOP REVERSE STAR DUAL
%right SIZEOF UNARY INCOP REVERSE STAR DUAL UNDUAL
%left HYPERUNARY
%left '.' '(' '['
%token <expr> VALUE STRING
%token <t> TOKEN
// end of tokens comment between qc and preprocessor
%token ELLIPSIS
%token RESERVED
// end of common tokens
%token <t.text> QSTRING HSTRING
@ -133,6 +136,7 @@ parse_error (void *scanner)
%token IF IFDEF IFNDEF ELSE ELIF ELIFDEF ELIFNDEF ENDIF
%token DEFINED EOD
%token CONCAT ARGS
%token EXTENSION VERSION
%type <t.text> string
%type <macro> params opt_params body arg arg_list arg_clist
@ -243,6 +247,13 @@ directive
extra_warn
| ENDIF { rua_endif (scanner); }
extra_warn
| EXTENSION ID ':' ID eod
| VERSION VALUE opt_profile eod
;
opt_profile
: /* empty */
| ID
;
extra_warn

View file

@ -374,8 +374,6 @@ pp_vnumber '({s}*{m}?{pp_number}){2,4}{s}*'{ULFD}?
%%
#define ARRCOUNT(_k) (sizeof (_k) / sizeof (_k[0]))
static directive_t cond_directives[] = {
{"if", PRE_IF},
{"ifdef", PRE_IFDEF},
@ -785,7 +783,7 @@ parse_vector (const rua_tok_t *tok, yyscan_t scanner)
}
static int
parse_string (QC_YYSTYPE *lval, const rua_tok_t *tok, int type,
parse_string (rua_val_t *lval, const rua_tok_t *tok, int type,
yyscan_t scanner)
{
const char *str = make_string (tok->text, 0);
@ -980,7 +978,7 @@ convert_long (const expr_t *value)
}
static int
qc_token (rua_extra_t *extra, QC_YYSTYPE *lval, const rua_tok_t *tok,
qc_token (rua_extra_t *extra, rua_val_t *lval, const rua_tok_t *tok,
yyscan_t scanner)
{
int token = tok->token;

View file

@ -124,6 +124,7 @@ int yylex (YYSTYPE *yylval, YYLTYPE *yylloc);
%right <op> '=' ASX
%right '?' ':'
%left OR
%left XOR
%left AND
%left '|'
%left '^'
@ -142,12 +143,14 @@ int yylex (YYSTYPE *yylval, YYLTYPE *yylloc);
%left '.' '(' '['
%token <expr> VALUE STRING TOKEN
// end of tokens common between qc and qp
%token ELLIPSIS
%token RESERVED
// end of common tokens
%token <symbol> CLASS_NAME NAME
%token LOCAL WHILE DO IF ELSE FOR BREAK CONTINUE
%token RETURN AT_RETURN ELLIPSIS
%token RETURN AT_RETURN
%token NIL GOTO SWITCH CASE DEFAULT ENUM ALGEBRA
%token ARGS TYPEDEF EXTERN STATIC SYSTEM OVERLOAD NOT ATTRIBUTE
%token <op> STRUCT
@ -2450,8 +2453,6 @@ obj_string
%%
#define ARRCOUNT(_k) (sizeof (_k) / sizeof (_k[0]))
// preprocessor directives in ruamoko and quakec
static directive_t rua_directives[] = {
{"include", PRE_INCLUDE},

View file

@ -100,6 +100,7 @@ typedef enum {
lang_object,
lang_ruamoko,
lang_pascal,
lang_glsl,
} lang_t;
typedef struct ext_lang_s {
@ -390,6 +391,9 @@ compile_to_obj (const char *file, const char *obj, lang_t lang)
case lang_pascal:
yyparse = qp_yyparse;
break;
case lang_glsl:
yyparse = glsl_yyparse;
break;
default:
internal_error (0, "unknown language enum");
}
@ -511,6 +515,12 @@ file_language (const char *file, const char *ext)
{".c", lang_ruamoko},
{".m", lang_ruamoko},
{".qc", lang_ruamoko},
{".comp", lang_glsl},
{".vert", lang_glsl},
{".tesc", lang_glsl},
{".tese", lang_glsl},
{".geom", lang_glsl},
{".frag", lang_glsl},
{".pas", lang_pascal},
{".p", lang_pascal},
{0, lang_object}, // unrecognized extension = object file

View file

@ -123,6 +123,7 @@ int yylex (void);
%right <op> '=' ASX
%right '?' ':'
%left OR
%left XOR
%left AND
%left '|'
%left '^'